c++ - 为什么大多数基类(虚拟)的默认构造函数在创建大多数派生类的对象时没有在私有(private)虚拟继承中被调用?

标签 c++ default-constructor virtual-inheritance ctor-initializer private-inheritance

在创建大多数派生类的对象时,如何在私有(private)虚拟继承中调用大多数基类的默认构造函数。但是在大多数派生类的构造函数初始化列表中提到时,不会调用相同的方法。

#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";}

我遇到以下编译错误:

错误:'class A A::A' is unaccessible within this context

为什么这里无法访问 A() 构造函数?

另一方面,下面提到的代码被成功编译并且 A() 构造函数被调用。

D()  {cout << "4";}

程序的输出是: 1234 表示正在调用 A() 构造函数。

那么,为什么在上述两种情况下调用构造函数 A() 的行为会发生变化?

我所知道的:

(1) 当我执行 B 和 C 的“公共(public)虚拟继承”时,大多数基类的默认构造函数被调用,即使它在大多数派生类的构造函数初始化列表中提到。 意味着下面的语句编译。 D() : A(), B(), C() {cout << "4";}

(2) 在虚继承中,虚基类的构造函数直接从大多数派生类的构造函数中调用。

这对我来说可能是虚拟继承的概念问题。请帮助我理解这一点并为此分享好的引用资料。

最佳答案

从 D 的角度来看,A 是私有(private)的,但即使不是,D 尝试构造 A 也是不正确的。它应该只构造直接基类和实例成员对象。默认情况下,B 和 C 都将负责 A 的构造。

关于c++ - 为什么大多数基类(虚拟)的默认构造函数在创建大多数派生类的对象时没有在私有(private)虚拟继承中被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43797505/

相关文章:

c++ - 在 boost.interprocess 中从共享内存进行 memcpy 的问题

c++ - 显式默认构造函数的目的

C++:继承的必备默认父类(super class)构造函数?

c++ - 一个类的 VTT 是什么?

C++虚拟继承内存布局

c++ - 非字符串文字是纯右值?

c++ - 写入文件在 Qt5/Qml 中不起作用

c++ - 基数到派生到构造函数中的另一个基数转换段错误 - 无效代码或编译器错误?

c++ - 从长远来看,使用调试器和大量使用 C++ 模板是否不兼容?

kotlin - Kotlin默认构造函数