在下面的代码中,似乎类C没有访问A的构造函数的权限,但由于虚继承是必需的,因此需要访问该构造函数。然而,代码仍然可以编译和运行。为什么它能够正常工作?
class A {};
class B: private virtual A {};
class C: public B {};
int main() {
C c;
return 0;
}
此外,如果我从A中删除默认构造函数,例如:
class A {
public:
A(int) {}
};
class B: private virtual A {
public:
B() : A(3) {}
};
那么
class C: public B {};
这将(意外地)编译通过,但是
class C: public B {
public:
C() {}
};
如预期的那样,编译失败。
该代码使用 "g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)" 编译通过,但已经验证它在其他编译器上的行为相同。
C
可以构造类型为A
的子对象。请注意,有基于private virtual
继承与A
中的私有构造函数以及通过友元授予B
访问权限来封闭继承的实现。如果仅使用私有虚拟继承就足够了,所有这些复杂性都是不必要的。 - David Rodríguez - dribeas