虚拟继承和受保护的成员访问

时间:2017-02-24 21:45:55

标签: c++ inheritance virtual

我在一个关于阻止类继承的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; }
};

1 个答案:

答案 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

代替旧的C ++ 03技术
class CBase final
{
public:
    CBase()
    {}
};
相关问题