Как в компиляторах реализуется виртуальное наследование на языке Си++?

Как компиляторы реализуют виртуальное наследование?

В следующем коде:

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::конструктора из конструктора производного класса используется первый экземпляр, в противном случае - второй.

23
задан River 18 October 2017 в 03:06
поделиться

1 ответ

Это зависит от реализации. GCC (см. этот вопрос ), например, создаст два конструктора, один с вызовом A(1), другой без.

B1()
B2() // no A

Когда создается B, «полная» версия называется:

B1():
    A(1)
    B() body

Когда создается C, вместо этого вызывается базовая версия:

C():
    A(3)
    B2()
       B() body
    C() body

В Фактически, два конструктора будут генерироваться, даже если виртуального наследования не будет, и они будут идентичны.

8
ответ дан 29 November 2019 в 02:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: