Когда я проверяю ваш пример, я получаю "D", а не "A", как вы упомянули.
class A {public: virtual void func() {std::cout << "A" << std::endl;} };
class B: virtual public A {};
class C: virtual public A {};
class D: virtual public C {public: virtual void func() {std::cout << "D" << std::endl;} };
class E: public B, public D {};
int main()
{
E e {};
e.func();
}
У вас есть проблема "Diamond".
A
B D // only B or D can override A::func()
E // can override A::func()
Кончик Алмаза - это класс А, и у него есть два класса, производных от него, «В» и «D», на каждой стороне алмаза.Только один из производных классов, являющихся частью сторон алмаза, может переопределить виртуальную функцию с кончика алмаза, но не оба из них (обратите внимание, что нижняя часть алмаза может переопределить, в этом случае E).В этом случае класс D, который переопределяет func
.Если класс B переопределит func
, он не скомпилируется.Также, если класс «B» и «D» ничего не переопределяют, в вашем примере будет вызвана A :: func ().