Как конструктор по умолчанию для большинства базовых классов вызывается в частном виртуальном наследовании при создании объекта большинства производных классов. Но то же самое не вызывается, когда упоминается в списке инициализатора конструктора самого производного класса.
#include<iostream>
using namespace std;
class A
{
public:
A() {cout << "1";}
};
class B: private virtual A
{
public:
B() {cout << "2";}
};
class C: private virtual A
{
public:
C() {cout << "3";}
};
class D: private B, private C
{
public:
D() : A(), B(), C() {cout << "4";}
//D() {cout << "4";}
};
int main()
{
D d1;
cout << "\n";
}
Моя проблема:
Ниже приведен код
D() : A(), B(), C() {cout << "4";}
Я получаю ниже ошибки компиляции:
ошибка: «класс A A :: A» недоступен в этом контексте
Почему конструктор A () здесь недоступен?
С другой стороны, упомянутый ниже код успешно компилируется и вызывается конструктор A ().
D() {cout << "4";}
Выход программы:
1234
Означает, что вызывается конструктор A ().
Итак, почему изменение поведения для вызова конструктора A () в двух вышеупомянутых случаях?
Что я знаю:
(1) Когда я делаю «Публичное виртуальное наследование» B & C, тогда вызывается конструктор по умолчанию для большинства базовых классов, даже если он указан в списке инициализаторов конструктора большинства производных классов.
Значит ниже инструкция компилируется.
D (): A (), B (), C () {cout << «4»;}
(2) В виртуальном наследовании конструктор виртуального базового класса вызывается непосредственно из конструктора самого производного класса.
Для меня это может быть проблемой виртуального наследования. Пожалуйста, помогите мне понять это и поделиться хорошими ссылками для этого.
A является частной с точки зрения D, но даже если это не так, для D некорректно пытаться создать A. Он должен создавать только прямые базовые классы и объекты-члены экземпляра. B и C будут видеть конструкцию A по умолчанию.
Других решений пока нет …