【发布时间】:2013-04-23 17:16:50
【问题描述】:
相关:Does "virtual base class in the case of multilevel inheritance" have significance
我有一个可以继承的模板类,以提供一些选择功能。但是,它希望阻止任何类进一步从继承它的任何东西继承。
以下似乎实现了这一点:
template<typename Child>
class SealingClass
{
public:
/*public methods etc*/
private:
SealingClass() {}
friend Child;
};
//simplify a bit:
#define Seal( x ) public virtual SealingClass< x >
现在,我可以继承上面的类了,如下:
class NewClass: Seal(NewClass) {};
如果我再尝试从NewClass 继承,如:
class AnotherClass: public NewClass {};
然后创建一个该类的实例:
AnotherClass a;
我得到了想要的错误,关于 SealingClass 中的构造函数是私有的。
所以,一切都如我所愿!
但是,我注意到如果我从定义中删除 virtual 关键字..
#define Seal( x ) public SealingClass< x >
..我的 AnotherClass 实例化现在可以正常工作了。
我了解virtual 关键字在这种情况下意味着在可能存在多个实例的多重继承(例如菱形继承)的情况下只定义基类的一个实例,从而导致模棱两可的函数调用等等
但是,为什么会影响上面的功能呢?
谢谢:)
【问题讨论】:
-
通过仔细阅读上面链接的答案,这听起来像是因为虚拟继承的类被实例化的顺序,这是有道理的!
-
IIRC 您必须在最派生类型中初始化一个虚拟基类,而在下一个派生类型中初始化非虚拟基类。
-
我假设你也有一个
private复制构造函数?否则,您可以简单地让所有子构造函数使用它来构造SealingClass,完全绕过密封。
标签: c++ inheritance virtual