본문 바로가기
C++ STL, 알고리즘

가상 베이스 클래스 (다이아몬드 상속 해결)

by wanna_dev 2024. 10. 7.

 

다중 상속문제중 동일한 클래스를 상속하는 부모 클래스를 여러 개 상속하면 모호함이 발생한다.

이럴 때는 부모 클래스에 자체 기능을 정의하지 않으면 어느 버전의 메서드를 호출할지 모르는 모호한 문제를 해결할 수 있다.

그런데 c++는 이렇게 중복되는 부모 클래스도 자체 기능을 가질 수 있도록 가상 베이스 클래스라는 기능을 제공한다.

중복되는 부모가 가상 베이스 클래스라면 모호한 상황이 발생할일이 없다.

다음 코드는 Animal 베이스 클래스에 sleep() 메서드를 추가하고, Dog와 Bird 클래스에서 Animal을 가상 베이스 클래스로 상혹하도록 수정했다.

이 과정에서 만약 Animal 클래스 앞에 virtual 키워드를 지정하지 않으면 DogBird객체로 sleep()을 호출할 때 모호함이 발생해서 컴파일 에러가 발생한다. DogBird입장에서 보래 Animal 의 하위 타입이 두개(Dog와 Bird)가 있기 때문이다.

하지만 Animal을 가상으로 상속하면 Animal의 하위 타입이 하나만 생성되기 때문에 sleep()을 호출할 때 모호한 상황이 발생하지 않는다.

class Animal{
public:
	virtual void eat() =0;
	virtual void sleep(){cout << "zzzz,,,," << endl;}
};

class Dog : public virtual Animal
{
public:
	virtual void bark(){
		cout<<"Woof!"<<endl;
	}
	virtual void eat() override{
		cout<< "The dog ate"<<endl;
	}
};
class Bird : public virtual Animal{
public:
	virtual void chirp(){
		cout<<"Chirp!"<<endl;
	}
	virtual void eat() override{
		cout<<"The Bird ate"<<endl;
	}

};

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

int main(){
	DogBird myConfusedAnimal;
	myConfusedAnimal.sleep();
	return 0;
}

 

참조 : 전문가를 위한 c++

'C++ STL, 알고리즘' 카테고리의 다른 글

++i vs i++ 누가 일반적인가.  (0) 2024.10.07
Optional Type  (0) 2024.10.07
파생 클래스의 복제 생성자와 대입 연산자  (0) 2024.10.07
Virtual  (0) 2024.10.07
스마트 포인터 c++  (0) 2024.10.07