Множественное (ромбовидное) наследование компилируется без «виртуального», но не с

Учитывая следующий код (без виртуального наследования):

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' . 

Почему во втором коде он другой?

12
задан curiousguy 21 July 2012 в 01:53
поделиться