class A { public: void eat(){ cout<<"A";} };
class B: virtual public A { public: void eat(){ cout<<"B";} };
class C: virtual public A { public: void eat(){ cout<<"C";} };
class D: public B,C { public: void eat(){ cout<<"D";} };
int main(){
A *a = new D();
a->eat();
}
다이아몬드 문제를 이해하고 있으며 위의 코드에는 문제가 없습니다.가상 상속이 "다이아몬드"(다중 상속) 모호성을 어떻게 해결합니까?
가상 상속이 문제를 정확히 어떻게 해결합니까?
는 이해가 무엇 : 내가 A *a = new D();
을 말할 때, 컴파일러가 타입 D
의 객체 타입 A
의 포인터에 할당 할 수 있는지 알고 싶어하지만, 그것이 따를 수있는 두 개의 경로를 가지고 있지만, 결정할 수 없습니다 그 자체로.
가상 상속으로 문제를 어떻게 해결할 수 있습니까 (도움 컴파일러가 결정을 내립니다)?
VTABLE 포인터 구현의 세부 사항이다. 이 경우 모든 컴파일러가 vtable 포인터를 도입하지는 않습니다. – curiousguy
그래프가 수직으로 대칭면 더 좋을 것이라고 생각합니다. 대부분의 경우 나는 밑에 파생 된 클래스를 보여주는 그러한 상속 다이어그램을 발견했습니다. ("downcast", "upcast"참조) – peterh