[c++] 가상 상속이란 무엇인가
예를 들어, DerivedClass
가 BaseClass1
과 BaseClass2
를 모두 상속받는 상황을 생각해보겠습니다. 이 경우, 만약 BaseClass1
과 BaseClass2
가 모두 SomeMethod()
라는 동일한 이름의 함수를 가지고 있다면, DerivedClass
에서 SomeMethod()
를 호출할 때 어떤 부모 클래스의 SomeMethod()
를 호출해야 하는지 모호해집니다. 이런 모호성은 다이아몬드 문제라고 불리며, 가상 상속은 이를 해결하기 위한 방법으로 사용됩니다.
가상 상속을 통해 동일한 부모 클래스를 공유하는 상속 관계에서 발생하는 중복을 제거함으로써 다이아몬드 문제를 해결할 수 있습니다. 이를 위해 virtual
키워드를 사용하여 가상 상속을 표시하고, 클래스 정의에서 virtual
키워드를 사용하여 해당 클래스를 가상 클래스로 선언합니다.
가상 상속은 클래스 간의 복잡한 상속 관계에서 다이아몬드 문제를 해결하는 데 도움을 줄 수 있지만, 오랜 기간 동안 프로젝트를 유지보수하는 경우 복잡성을 증가시키고 가독성을 떨어뜨릴 수 있으므로 신중하게 사용해야 합니다.
class BaseClass1 {
public:
void SomeMethod() {}
};
class BaseClass2 {
public:
void SomeMethod() {}
};
class DerivedClass : public virtual BaseClass1, public virtual BaseClass2 {
public:
void CallSomeMethod() {
SomeMethod(); // 호출시, 모호성 문제가 없음
}
};
더 자세한 내용은 “C++ Primer”나 “Effective C++”와 같은 참고 자료를 참고하시기 바랍니다.