阻止虚拟继承

Blocking virtual inheritance

本文关键字:继承 虚拟      更新时间:2023-10-16

在现代c++中是否有一种方法可以防止类被虚拟继承,同时又允许常规继承?现在这对我来说似乎是不可能的,但是在这门语言中有太多的事情看起来是不可能的。

为继承基指定virtual关键字的目的是防止它在继承层次结构中被实例化多次。因此,不能首先阻止this的使用(参见"什么是虚拟基类")。
我相信您可能已经混淆了您的可能性,如何控制实际上可以通过继承类被覆盖的内容。

如果你没有在你的类中声明virtual方法,那么继承类就不能为该基的任何方法提供任何virtual覆盖。
在语义上最好的表述是

class Foo {
public:
    Foo() {}
protected:
    ~Foo() {} // Explicitly non virtual destructor, prevents virtual inheritance
              // 'protected' forces inheritance to use this class
};

即使使用引入的纯抽象接口,这也应该工作得很好

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关键字进行继承,并且您似乎无法阻止它。

虽然您可以通过简单地将这些实现提供为私有来防止继承类来(重新)实现接口,但是:

class Foo : public IFace {
private:
     // Implementation of interface methods
     virtual void some_operation() { 
     }
};