在创建大多数派生类的对象时,如何在私有(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/