Виртуальное наследование по-прежнему необходимо, когда базовые классы не содержат данных?

Не повлияет ли на следующий код на отсутствие виртуального наследования?

Если бы так, будут ли отрицательные эффекты такими же (или такими же плохими), как и отрицательные эффекты множественного наследования без виртуального наследования, если class A сделал элементы данных?

class A
{
public :
    virtual ~A ( ) { }
    virtual int foo ( ) const = 0 ;
} ;

class B : public A
{
public :
    virtual ~B ( ) { }
} ;

class C : public A
{
public :
    virtual ~C ( ) { }
} ;

class D : public B , public C
{
public :
    virtual int foo ( ) const { return 12 ; }
} ;

Ответ 1

Предполагая, что вы хотите использовать A в качестве общего интерфейса, если вы не сделаете виртуальное наследование виртуальным, вы не сможете сделать что-то вроде этого, потому что есть два пути наследования базового класса A из дочернего D:

int main()
{
    D d;
    const A& a = d;

    std::cout << a.foo() << " " << d.foo() << " " << std::endl;
}

Если вам не нужно использовать D как A, тогда (A), почему у вас есть его как абстрактная база в первую очередь и (B) Нет, нет необходимости в наследовании быть виртуальным.

Ответ 2

class B : public virtual A { } ;
class C : public virtual A { } ;

Используя виртуальное наследование промежуточных классов, ваш класс D будет иметь только один экземпляр класса A, и ваш код будет компилировать только тонкие