반응형

출처 :         https://www.yes24.com/Product/Goods/9328793

 

상속 관계에서의 함수 재정의(redefine)

함수 재정의 (Function Redefinition):
   - 함수 재정의는 부모 클래스에서 정의한 함수를 자식 클래스에서 다시 정의하거나 수정하는 것을 의미합니다.
   - 이를 통해 자식 클래스는 부모 클래스로부터 상속받은 함수의 동작을 변경할 수 있습니다.
   - 함수 재정의는 다음과 같이 이루어집니다:
     - 자식 클래스에서 부모 클래스의 함수를 동일한 시그니처로 선언하고 다시 정의합니다.
     - 선언할 때 `virtual` 키워드를 사용하지 않습니다.

     class Animal {
     public:
         void makeSound() {
             cout << "동물이 소리를 낸다." << endl;
         }
     };

     class Dog : public Animal {
     public:
         void makeSound() {
             cout << "강아지가 짖는다." << endl;
         }
     };

 

가상 함수와 오버라이딩

가상 함수와 오버라이딩 (Virtual Functions and Overriding):
   - 가상 함수는 부모 클래스에서 정의되고, 자식 클래스에서 필요한 경우 재정의할 수 있는 함수입니다. 이를 통해 다형성을 구현할 수 있습니다.
   - 가상 함수는 다음과 같이 정의하며, 파생 클래스에서 다시 정의할 때 `override` 키워드를 사용합니다:

     class Animal {
     public:
         virtual void makeSound() {
             cout << "동물이 소리를 낸다." << endl;
         }
     };

     class Dog : public Animal {
     public:
         void makeSound() override {
             cout << "강아지가 짖는다." << endl;
         }
     };


   - `override` 키워드를 사용하면 컴파일러가 해당 함수가 부모 클래스의 가상 함수를 오버라이딩하는지 확인할 수 있습니다.


추상 클래스

추상 클래스 (Abstract Class):
   - 추상 클래스는 하나 이상의 순수 가상 함수(순수 가상 멤버 함수)를 포함하는 클래스입니다. 순수 가상 함수는 함수의 본문이 없고 "= 0"으로 표시합니다.
   - 추상 클래스는 객체를 직접 생성할 수 없으며, 파생 클래스에서 순수 가상 함수를 반드시 구현해야 합니다.
   - 추상 클래스는 주로 인터페이스를 정의하고 파생 클래스에 구현을 위임하기 위해 사용됩니다.

     class Shape {
     public:
         virtual void draw() = 0; // 순수 가상 함수
     };

     class Circle : public Shape {
     public:
         void draw() override {
             cout << "원을 그립니다." << endl;
         }
     };



   - 위의 예제에서 `Shape` 클래스는 추상 클래스로, `draw()` 함수를 순수 가상 함수로 정의하고 있습니다. `Circle` 클래스는 `Shape` 클래스를 상속하고 `draw()` 함수를 구현하여 사용합니다.

추상 클래스와 가상 함수를 사용하면 다형성을 활용하여 런타임에 다양한 객체의 메서드를 호출할 수 있으며, 코드의 확장성과 유지 보수성을 향상시킬 수 있습니다. 이러한 개념은 객체 지향 프로그래밍에서 중요한 역할을 합니다.

 

반응형

+ Recent posts