Почему конструктор по умолчанию для большинства базовых классов (Virtual) не вызывается в частном виртуальном наследовании при создании объекта большинства производных классов?

Как конструктор по умолчанию для большинства базовых классов вызывается в частном виртуальном наследовании при создании объекта большинства производных классов. Но то же самое не вызывается, когда упоминается в списке инициализатора конструктора самого производного класса.

#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) В виртуальном наследовании конструктор виртуального базового класса вызывается непосредственно из конструктора самого производного класса.

Для меня это может быть проблемой виртуального наследования. Пожалуйста, помогите мне понять это и поделиться хорошими ссылками для этого.

1

Решение

A является частной с точки зрения D, но даже если это не так, для D некорректно пытаться создать A. Он должен создавать только прямые базовые классы и объекты-члены экземпляра. B и C будут видеть конструкцию A по умолчанию.

0

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

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