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

时间:2014-06-10 08:54:06

标签: c++ multiple-inheritance

为什么会这样?

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

3 个答案:

答案 0 :(得分:3)

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

  

为什么会这样?

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

  

为什么显式通话不起作用?

由于CL4 无法访问CL2CL3的私人会员。

答案 1 :(得分:2)

这是因为您正在使用从CL2/3CL1的私有继承。这意味着它们“以” CL1实现,而不是它们 CL1(这是公共继承的含义)。您无法将班级CL2转换为CL1,因此CL4也不是CL1

您只能在CL1中访问CL2的成员,就像他们是私人成员一样。

答案 2 :(得分:1)

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