【问题标题】:Blocking virtual inheritance阻止虚拟继承
【发布时间】:2014-08-11 16:58:04
【问题描述】:

在现代 C++ 中有没有一种方法可以防止类被虚拟继承,同时允许常规继承?现在对我来说这似乎是不可能的,但是这种语言中有太多的东西似乎是不可能的。

【问题讨论】:

  • 也许我误解了你的问题,但你不能避免“虚拟”这个词吗?
  • 明确没有虚拟类析构函数声明/定义!甚至可以做到protected
  • OP要禁止struct C : virtual Base {};
  • @VictorK 那你想要什么,这对我来说听起来有点矛盾!请详细说明您为什么'就我而言,我完全需要一个虚拟析构函数'
  • 通常我会问你为什么要这样做,因为这闻起来像 X-Y 问题。但在这种情况下,我真的很想知道这是否可能。

标签: c++ inheritance virtual virtual-inheritance


【解决方案1】:

为继承基指定的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
};

即使使用引入的纯抽象接口,这也应该可以正常工作

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() { 
     }
};

【讨论】:

  • 如果你的类中没有声明虚拟方法,它就不能被虚拟继承——这真的是新事物
  • 这是错误的,基类不能保证不被虚拟继承。
  • @DieterLücking 但是可以让virtual 继承无用,不是吗?!?
  • @VictorK 请在答案中查看我的更新!似乎您根本无法阻止指定 virtual 关键字的继承类,似乎您一直在混淆它的目的可能是...
  • 虚继承与虚函数无关。伙计,感谢您的宝贵时间,但不幸的是,您的回答没有用。
猜你喜欢
  • 2016-10-26
  • 2013-08-24
  • 2016-03-26
  • 2011-01-08
相关资源
最近更新 更多