在创建大多数派生类的对象时,如何在私有虚拟继承中调用大多数基类的默认构造函数。但是当在大多数派生类的构造函数初始化列表中提到时,同样不会被调用。
#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";}
我得到以下编译错误:
错误:在此上下文中无法访问“类 AA::A”
为什么 A() 构造函数在这里无法访问?
另一方面,下面提到的代码被成功编译并且 A() 构造函数被调用。
D() {cout << "4";}
程序的输出是:
1234
意味着 A() 构造函数被调用。
那么,为什么在上述两种情况下调用构造函数 A() 的行为会发生变化?
我知道的:
(1) 当我对 B & C 进行“公共虚拟继承”时,即使在大多数派生类的构造函数初始化程序列表中提到了大多数基类的默认构造函数,也会被调用。表示下面的语句编译。D() : A(), B(), C() {cout << "4";}
(2) 在虚继承中,大多数派生类的构造函数直接调用虚基类的构造函数。
对我来说,这可能是虚拟继承的概念问题。请帮助我理解这一点并为此分享良好的参考资料。