我在一个关于阻止类继承的SO问题中看到了下面的例子,我不明白为什么它应该工作:如果我有一个类" CTest"公开继承CBase,编译失败,因为在构造函数' CTest :: CTest()' ' CSealed :: CSealed()'受到保护。如果我摆脱虚拟关键字,编译成功,为什么?
class CSealed
{
protected:
CSealed()
{
}
};
class CBase : virtual CSealed
{
public:
CBase() {
}
};
class CTest : public CBase
{
public:
CTest() { std::cout << "TEST !!!!\n " << std::endl; }
};
答案 0 :(得分:0)
您发布的代码,
class CSealed
{
protected:
CSealed()
{}
};
class CBase : virtual CSealed
{
public:
CBase()
{}
};
不允许CBase
派生。这是因为虚拟基类必须由派生程度最高的类的(每个)构造函数初始化。由于虚拟基础是private
基类,因此从CBase
派生的类无法访问它。
,例如,这个类派生,
class CTest
: public CBase
{};
不应该编译它CTest
是实例化的。
然而,事实上,虽然它无法使用Visual C ++ 2015进行编译,但它确实使用MinGW g ++ 6.3.0进行编译,因此在实践中它并不完全可靠。
您可以使用C ++ 11 final
:
class CBase final
{
public:
CBase()
{}
};