在现代C++中,有没有一种方法可以防止类被虚拟继承,而同时允许常规继承呢?现在对我来说似乎是不可能的,但是用这种语言似乎有太多的事情似乎是不可能的。
最佳答案
为继承的基数指定virtual
关键字的目的是防止它在继承层次结构中实例化多次。因此,一开始就无法避免使用此方法(另请参见'What is a virtual base class')。
我相信您可能对如何控制继承类实际上可以覆盖的可能性感到困惑。
如果您的类中没有声明virtual
方法,则继承类无法为该基础中的任何方法提供virtual
覆盖。
最好首先从语义上说明这一点是
class Foo {
public:
Foo() {}
protected:
~Foo() {} // Explicitly non virtual destructor, prevents virtual inheritance
// 'protected' forces inheritance to use this class
};
即使使用引入的纯抽象接口(interface),也应能很好地工作
struct IFace {
virtual void some_operation() = 0;
virtual ~IFace() {}
};
class Foo : public IFace {
public:
// Implementation of interface methods
virtual void some_operation() {
}
// Same as above. Possibility of virtual inheritance stops here
};
更新:
似乎@DieterLücking的评论和您的在线代码示例反驳了我所说的内容。显然,这并没有停止使用
virtual
关键字进行继承,这似乎没有停止,而且似乎您无能为力。尽管您可以简单地通过将这些实现作为私有(private)提供来防止继承类来(重新实现)接口(interface),然后:
class Foo : public IFace {
private:
// Implementation of interface methods
virtual void some_operation() {
}
};
关于c++ - 阻止虚拟继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24335662/