class — Виртуальный базовый класс вызывает пустой конструктор в C ++ (C ++ 11)

Давайте посмотрим на следующий код:

class A{
protected:
int _val;
public:
A(){printf("calling A empty constructor\n");}
A(int val):_val(val){printf("calling A constructor (%d)\n", val);}
};

class B: virtual public A{
public:
B(){printf("calling B empty constructor\n");}
B(int val):A(val){printf("calling B constructor (%d)\n", val);}
};

class C: public B{
public:
C(){printf("calling C empty constructor\n");}
C(int val):B(val){printf("calling C constructor (%d)\n", val);}
};

int main(void) {
C test(2);
}

Выход:

calling A empty constructor
calling B constructor (2)
calling C constructor (2)

Может ли кто-нибудь объяснить мне, почему конструктор класса A вызывается без каких-либо аргументов?
Дополнительно, как я могу «исправить» это поведение, если я хочу, чтобы класс B наследовал виртуально от A?
(Если наследование не виртуальное — образец работает нормально)

7

Решение

В С ++ 03 было бы то же самое.

Виртуальные базовые конструкторы всегда вызываются из конечного конечного класса.
Если при создании экземпляра C вам требуется что-то еще, кроме конструктора по умолчанию для A, вы должны указать это и в конструкторе класса C.

C(int val): A(val), B(val) {printf("calling C constructor (%d)\n", val);}
10

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector