在现代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/

10-12 12:28
查看更多