多重继承和不可访问的默认构造函数

Multiple inheritance and inaccessible default constructor

本文关键字:默认 构造函数 访问 多重继承      更新时间:2023-10-16

为什么有效

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

CL2CL3私有地继承了CL1 ,因此CL1中的所有内容(包括构造函数)在这些派生类中都是私有的。前一种情况有效,因为CL1::CL1()是由派生类的构造函数调用的。但是你不能显式地调用它,因为对于你的继承链,你可以通过一个派生类(CL2CL3)访问构造函数,但是在这些类中它是私有的,只有其他类成员可以访问它。

为什么有效?

因为CL2CL3 可以访问它们的私有成员(包括基类构造函数)

为什么显式调用不起作用?

因为CL4 不能访问CL2CL3的私有成员

这是因为您正在使用从CL2/3CL1的私有继承。这意味着它们是按照 CL1实现的,而不是它们是 CL1(这是公共继承的含义)。您不能将CL2类转换为CL1类,因此CL4也不是CL1类。

CL1的成员只能在CL2中作为私有成员访问。

由于CL4派生自CL3、CL2,因此CL1类的CL1构造函数不能从CL4显式访问。如果是成员函数,即基类的成员函数可以从派生类访问,则构造函数不能,因为CL4类不能转换为CL1。