[c++] 가상 상속이란 무엇인가

예를 들어, DerivedClassBaseClass1BaseClass2를 모두 상속받는 상황을 생각해보겠습니다. 이 경우, 만약 BaseClass1BaseClass2가 모두 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++”와 같은 참고 자료를 참고하시기 바랍니다.