虚拟继承和受保护的成员访问
virtual inheritance and protected members access
我在关于防止 class 继承的 SO 问题中看到了下面的示例,但我不明白为什么它应该起作用:如果我有一个 class "CTest" 继承公开 CBase,编译失败,因为在构造函数中 'CTest::CTest()' 'CSealed::CSealed()' 受到保护。如果我摆脱 virtual 关键字,编译成功,为什么?
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
派生。那是因为虚基 class 必须由最派生的 class 的(每个)构造函数初始化。并且由于虚拟基础是 private
基础 class,因此无法访问从 CBase
.
派生的 class
例如,这个class推导,
class CTest
: public CBase
{};
不应编译它 CTest
曾经实例化过。
然而,事实上,虽然它无法使用 Visual C++ 2015 进行编译,但它可以使用 MinGW g++ 6.3.0 进行编译,因此在实践中它并不完全可靠。
您可以使用 C++11 而不是这种旧的 C++03 技术 final
:
class CBase final
{
public:
CBase()
{}
};
我在关于防止 class 继承的 SO 问题中看到了下面的示例,但我不明白为什么它应该起作用:如果我有一个 class "CTest" 继承公开 CBase,编译失败,因为在构造函数中 'CTest::CTest()' 'CSealed::CSealed()' 受到保护。如果我摆脱 virtual 关键字,编译成功,为什么?
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
派生。那是因为虚基 class 必须由最派生的 class 的(每个)构造函数初始化。并且由于虚拟基础是 private
基础 class,因此无法访问从 CBase
.
例如,这个class推导,
class CTest
: public CBase
{};
不应编译它 CTest
曾经实例化过。
然而,事实上,虽然它无法使用 Visual C++ 2015 进行编译,但它可以使用 MinGW g++ 6.3.0 进行编译,因此在实践中它并不完全可靠。
您可以使用 C++11 而不是这种旧的 C++03 技术 final
:
class CBase final
{
public:
CBase()
{}
};