【问题标题】:Is this example working with virtual inheritance in C++?此示例是否使用 C++ 中的虚拟继承?
【发布时间】:2020-08-19 20:15:05
【问题描述】:

我可以这样做吗?

class A {
public:
  virtual void aFoo() = 0;
};

class B : virtual public A {
public:
  virtual void aFoo() { ... }
};

class D : public A {};

class C : public B, virtual public D {};

问题在于BaFoo() 的实现以及C 中缺少它。在编译时,我看到了这个错误:

error: no unique final overrider for ‘virtual void A::aFoo()’ in ‘C’

不应该可以覆盖B中虚基类的纯虚方法吗?


刚刚编辑了示例以匹配实际用例。现在以这种简化的方式来看它,我不太确定这是否可能,更不用说好的设计了。

【问题讨论】:

  • 如果 B 已经从 A 继承,则不应从 A 和 B 继承。那是错误的。正如错误消息所说,您必须从 A 覆盖 Foo,因为您直接从它继承。 (假设缺少代码的顶级类是 A 类)
  • 我明白了,我在示例中犯了一个错误。 C 应该实现另一种类型 D,它再次虚拟地继承 A。我会解决这个问题,对于这里的混乱,我深表歉意。
  • 哪个编译器给你这个错误?没关系here
  • 托马斯,感谢您的链接。我的问题更多是关于钻石问题中纯虚函数的使用。恐怕那里的答案并不能提供任何关于此的信息。

标签: c++ overriding multiple-inheritance virtual-functions virtual-inheritance


【解决方案1】:

你需要通过这种方式进行虚拟继承:

struct A {
    virtual int f() = 0;
};
struct B : virtual A {
    int f() { return 1; }
};
struct C : virtual A {};
struct D : B, C {};

int main() {
    D d;
    return d.f();
}

在我评论的欺骗中你可以看到这种关系

  A  
 / \  
B   C  
 \ /  
  D 

用于虚拟继承和

A   A  
|   |
B   C  
 \ /  
  D 

没有虚拟继承。

在第二种情况下,D 包含两个函数定义。一种实现了,一种没有实现。

【讨论】:

  • 这是对我的问题的完美答案(也是幸运地解决了问题的答案)。太感谢了! :)
猜你喜欢
  • 2020-07-04
  • 2016-03-26
  • 2011-01-08
  • 1970-01-01
  • 2011-07-07
相关资源
最近更新 更多