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



我在以下有关防止类继承的问题中看到了下面的示例,我不明白为什么它应该起作用:如果我有一个" ctest"的" ctest",该类" 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; }
};

您已发布的代码,

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 03技术,您可以使用C 11 final

class CBase final
{
public:
    CBase()
    {}
};

最新更新