为什么会这样?
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
答案 0 :(得分:3)
CL2
和CL3
私下继承CL1
,因此CL1
(包括构造函数)中的所有内容在这些派生类中都变为私有。前一种情况有效,因为CL1::CL1()
由派生类的构造函数调用。但是您无法显式调用它,因为对于您的继承链,您可以通过其中一个派生类(CL2
或CL3
)访问构造函数,但它是私有在那些课程中,只有其他班级成员可以访问它。
为什么会这样?
因为CL2
和CL3
可以访问他们的私有成员(包括基类构造函数)
为什么显式通话不起作用?
由于CL4
无法访问CL2
和CL3
的私人会员。
答案 1 :(得分:2)
这是因为您正在使用从CL2/3
到CL1
的私有继承。这意味着它们“以” CL1
实现,而不是它们 CL1
(这是公共继承的含义)。您无法将班级CL2
转换为CL1
,因此CL4
也不是CL1
。
您只能在CL1
中访问CL2
的成员,就像他们是私人成员一样。
答案 2 :(得分:1)
由于CL4派生自CL3,CL2,因此无法从CL4显式访问CL1类的CL1构造函数。如果它是成员函数,即基类的成员函数可以从派生类访问,构造函数不能因为CL4类不能转换为CL1。