Как компиляторы реализуют виртуальное наследование?
В следующем коде:
class A {
public:
A(int) {}
};
class B : public virtual A {
public:
B() : A(1) {}
};
class C : public B {
public:
C() : A(3), B() {}
};
Генерирует ли компилятор два экземпляра функции B::ctor
, один без вызова A(1)
, и один с ним? Итак, при вызове B::конструктора
из конструктора производного класса используется первый экземпляр, в противном случае - второй.
Это зависит от реализации. GCC (см. этот вопрос ), например, создаст два конструктора, один с вызовом A(1)
, другой без.
B1()
B2() // no A
Когда создается B, «полная» версия называется:
B1():
A(1)
B() body
Когда создается C, вместо этого вызывается базовая версия:
C():
A(3)
B2()
B() body
C() body
В Фактически, два конструктора будут генерироваться, даже если виртуального наследования не будет, и они будут идентичны.