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