Vic*_*rov 6 c++ virtual inheritance virtual-inheritance
在现代C++中是否有一种方法可以防止类被虚拟继承,同时允许定期继承?现在对我来说似乎不可能,但这种语言中有太多东西似乎是不可能的.
virtual为继承的基础指定的关键字的目的是防止它在继承层次结构中多次实例化.因此,首先无法阻止使用此功能(另请参阅"什么是虚拟基类").
我相信你可能会混淆你如何通过继承类来控制实际上可以被覆盖的东西.
如果您的类中没有virtual声明方法,则继承类不能virtual为该基类中的任何方法提供任何覆盖.
最好首先在语义上说明这一点
class Foo {
public:
    Foo() {}
protected:
    ~Foo() {} // Explicitly non virtual destructor, prevents virtual inheritance
              // 'protected' forces inheritance to use this class
};
Run Code Online (Sandbox Code Playgroud)
即使使用引入的纯抽象接口,这应该很好
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
};
Run Code Online (Sandbox Code Playgroud)
更新:
 
似乎@DieterLücking的评论和您的在线代码示例反驳了我所说的内容.这显然不会停止virtual在第一位使用关键字继承,而且似乎没有什么可以对付它.
虽然您可以通过将这些实现提供为私有来阻止继承类(重新)实现接口,然后:
class Foo : public IFace {
private:
     // Implementation of interface methods
     virtual void some_operation() { 
     }
};
Run Code Online (Sandbox Code Playgroud)