언어/Basic C++

[Basic C++] #21_가상 상속

Hardii2 2022. 5. 1. 21:00

[Basic C++] #21_가상 상속

 

C++ 개발에 사용되는 "가상 상속"개념에 대해 알아보겠습니다.

 


 

Overview

 

  1. 개념
  2. 코드

 

#0. 개념
class Animal
{
public:
    virtual void eat() = 0;
    virtual void sleep() {cout << "zzzzzz....." << endl;}
};

class Dog : public Animal
{
public:
    virtual void eat() override {cout << "Eat Method is called! " << endl; }
    virtual void bark() {cout << "Bark!" << endl;}
};

class Bird : public Animal
{
    virtual void eat() override {cout << "Eat Method is called!" << endl;}
    virtual void chirp() {cout << "Chirp!" << endl;}
};

class DogBird : public Dog, Bird
{
public:
    virtual void eat() override {Dog::eat();}
};

int main ()
{
    DogBird myDogBird;
    myDogBird.sleep();	// 모호성 발생!!
    return 0;
}

 

Details

 

  • C++는 다중 상속으로 인해 상속 계층 구조에서 나타나는 다중 인스턴스를 방지하기 위해 "가상 상속" 기능을 제공합니다.
  • 위 예제를 살펴보면, 가장 상위의 Animal 클래스를 Dog 클래스와 Bird 클래스가 상속합니다. 최종적으로 DobBird 클래스가 Dog 클래스와 Bird 클래스를 다중 상속합니다. 
  • 이때, DogBird 객체를 생성하여 Animal 클래스의 함수를 호출해 봅시다. 해당 메서드는 Dog 객체가 상속하는 Animal 객체의 메서드일까요? 아니면 Bird 클래스가 상속하는 Animal 객체의 메서드일까요? 모호성이 발생합니다!
  • 이때, "가상 상속"을 사용합니다. 아래 예제를 살펴보시죠!

 

#1. 코드

1. Animal 코드 수정

class Animal {

public:
    virtual void Eat() { cout << " Eat! " << endl; }
    
};

class Dog : virtual public Animal {};

class Bird : virtual public Animal {};

class DogBird : public Dog, Bird {};

int main()
{
    DogBird* DogBirdInst = new DogBird();
    DogBirdInst->Eat(); // 모호성 해결! 
    
    delete DogBird;
    
    return;
}

 

Details

 

  • 가상 상속 사용 방법은 간단합니다.
  • 가상 상속 시 public 키워드 대신 "virtual public" 키워드를 사용합니다.