Учитывая следующий код (без виртуального наследования):
class A
{
public:
virtual void f() = 0;
};
class B : public A
{
public:
virtual void f() {}
};
class C : public A
{
public:
virtual void f() {}
};
class D : public B, public C
{
/* some code */
};
int main()
{
D d;
return 0;
}
компиляция кода.
С другой стороны, здесь:
class A
{
public:
virtual void f() = 0;
};
class B : virtual public A
{
virtual void f() {}
};
class C : virtual public A
{
virtual void f() {}
};
class D : public B, public C
{
/* some code */
};
int main()
{
D d;
return 0;
}
Компилятор представляет ошибку компиляции:
no unique final overrider for 'virtual void A::f()' in 'D' .
Почему во втором коде он отличается?