【发布时间】:2011-01-23 04:36:45
【问题描述】:
在下面的代码中,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)”编译的代码,但已验证与其他编译器的行为相同。
【问题讨论】:
-
使用 g++ 4.4 可以编译。虽然我无法找到权威参考,但我相信它应该编译。派生最多的类
C可以构造A类型的子对象。请注意,有一些实现基于private virtual继承together 与A中的私有构造函数的组合以及通过友谊授予B的访问权限来密封继承。如果只使用私有虚拟继承就足够了,那么所有的复杂性都是不必要的。 -
@DavidRodríguez-dribeas "如果只使用私有虚拟继承就足够了,那么所有的复杂性都是不必要的。" 这里没有人声称密封习语在没有私有 ctor 的情况下也有效。在密封习语中,不需要私有继承,但需要将习语的使用作为实现细节。
标签: c++ inheritance encapsulation virtual-inheritance private-inheritance