가상 기본 하위 개체는 전체 개체의 모든 기본 하위 개체간에 '공유'됩니다.
#include <iostream>
struct A {
virtual void f() = 0;
virtual ~A() {}
};
struct B : virtual A
{
void f() { std::cout << "B\n"; }
};
struct C : virtual A
{
void f() { std::cout << "C\n"; }
};
struct D : C, B {};
int main() {
D d;
A *a = dynamic_cast<A*>(&d); // single shared A between B and C
a->f(); // Should B::f() be called, or C::f()?
}
을 : A는 D : C : B와 D : B 사이에 공유되어 있기 때문에 그것의 f()
이 고려 A::f().
에 대한 재정로 불리는이해야하는 B 객체 말할 수 없다 D의 B 및 C 기본 하위 객체는 모두 동일한 A 기본 하위 객체를 공유합니다. 우리가 A :: f()를 호출 할 때, 오버라이드 (override) 된 함수에 대해 가상 룩업 (look-up)이 수행된다. 그러나 B와 C는 모두이를 무시하려고 시도하고 있으므로 어느 것이 '이기는가'? x->f()
"B"또는 "C"가 인쇄됩니까?대답은 상황에 부딪히는 프로그램이 잘못 형성되었다는 것입니다. 우리가함으로써 공유를 제거하면
B와 C는 각각의 기능은 고유 한 기본 클래스에 의해 재정의 한 비 사실상 다음 별도의베이스 하위 오브젝트를 상속 :
#include <iostream>
struct A {
virtual void f() = 0;
virtual ~A() {}
};
struct B : A
{
void f() { std::cout << "B\n"; }
};
struct C : A
{
void f() { std::cout << "C\n"; }
};
struct D : C, B {};
int main() {
D d;
// two different A objects
A *a1 = static_cast<A*>(static_cast<B*>(&d));
A *a2 = static_cast<A*>(static_cast<C*>(&d));
a1->f();
a2->f();
}
[다중 상속 가능한 중복 + 가상 함수 혼란] (http://stackoverflow.com/questions/616380/multiple-inheritance-virtual-function-mess) – Zeta