多重继承和不可访问的默认构造函数
Multiple inheritance and inaccessible default constructor
为什么有效
class CL1{};
class CL2:private virtual CL1{};
class CL3:private virtual CL1{};
class CL4:public CL2,public CL3
{
public:
CL4():CL2(),CL3(){}
};
int main()
{
CL4 cl4;
return 0;
}
,但如果显式调用虚基类的构造函数
CL4():CL1(),CL2(),CL3(){}
,那么它不起作用?注:编译器是https://ideone.com/HuHlCB
CL2
和CL3
私有地继承了CL1
,因此CL1
中的所有内容(包括构造函数)在这些派生类中都是私有的。前一种情况有效,因为CL1::CL1()
是由派生类的构造函数调用的。但是你不能显式地调用它,因为对于你的继承链,你可以通过一个派生类(CL2
或CL3
)访问构造函数,但是在这些类中它是私有的,只有其他类成员可以访问它。
为什么有效?
因为CL2
和CL3
可以访问它们的私有成员(包括基类构造函数)
为什么显式调用不起作用?
因为CL4
不能访问CL2
和CL3
的私有成员
这是因为您正在使用从CL2/3
到CL1
的私有继承。这意味着它们是按照 CL1
实现的,而不是它们是 CL1
(这是公共继承的含义)。您不能将CL2
类转换为CL1
类,因此CL4
也不是CL1
类。
CL1
的成员只能在CL2
中作为私有成员访问。
由于CL4派生自CL3、CL2,因此CL1类的CL1构造函数不能从CL4显式访问。如果是成员函数,即基类的成员函数可以从派生类访问,则构造函数不能,因为CL4类不能转换为CL1。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 初始化具有非默认构造函数的std::数组项的更好方法
- 具有默认模板类型的默认构造函数的类型推导
- 如何使用非默认构造函数实例化模板化类
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 声明没有默认构造函数的字段
- 没有默认构造函数作为模板参数的自定义比较器
- C++17 没有默认构造函数的地图放置(私有默认构造函数)
- 使用移动调用对等构造函数unique_ptr默认构造函数
- C++复制构造函数和默认构造函数
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 具有非默认构造函数的单例类
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 如何处理没有默认构造函数但在另一个构造函数中构造的对象?
- 在C++中使用默认构造函数初始化对象的不同方法
- 在没有默认构造函数的情况下创建的派生对象
- 强制使用默认构造函数对成员进行未初始化的声明
- 使用默认构造函数初始化对象的不同方法
- 创建类类型的动态分配数组,其中类不得具有默认构造函数