[Basic C++] #21_가상 상속
C++ 개발에 사용되는 "가상 상속"개념에 대해 알아보겠습니다.
Overview
- 개념
- 코드
#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" 키워드를 사용합니다.
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #24_우측 값 참조, 대입 연산의 좌항과 우항 (0) | 2022.05.14 |
---|---|
[Basic C++] #23_참조형 파라미터, 참조에의한 전달 (0) | 2022.05.08 |
[Basic C++] #20_virtual 키워드, vtable 오버헤드 (0) | 2022.05.01 |
[Basic C++] #19_virtual, virtual의 내부 구현 (0) | 2022.04.30 |
[Basic C++] #18_오버라이딩의 특수한 경우 여섯 번째, 일반 메소드의 오버라이딩 (0) | 2022.04.30 |