C++多菱形继承和纯虚函数

标签 c++ interface multiple-inheritance virtual-functions diamond-problem

考虑以下架构:

class A  //abstract interface
{
    public:
    virtual void f() = 0;
};
class AA : public A  //abstract interface
{
    public:
    virtual void g() = 0;
}; 
class AAA : public AA  //abstract interface
{
    public:
    virtual void h() = 0;
}; 

class B :  public A // implementation class
{
    public:
    void f() override {};
};
class BB : public B, public AA {}; // implementation class
{
    public:
    void g() override {};
};
class BBB : public BB, public AAA {}; // implementation class
{
    public:
    void h() override {};
};

因此,BBBBB 是虚拟类,因为 f 不会被 BB 覆盖,f 和 g 也不会被 BBB 覆盖。我的愿望是能够实例化BB和BBB(这样BB和BBB使用B定义的f的override,BBB使用BB定义的g的override)。

问题是:哪些继承关系应该标记为virtual来实例化BBBBB

理想情况下,继承图应如下所示:

A
|\
| \
|  \
AA   B
| \  |
|  \ |
AAA  BB
  \  |
   \ |
     BBB

此设计背后的想法是 A、AA 和 AAA 是描述增量功能级别的接口(interface)。 B、BB、BB是一个对应的增量实现。 (例如,BB 定义了 AA 所需的一切,并且还具有 B 中的内容)

最佳答案

如果 A AA AAA 真的只是接口(interface),我的意思是它们没有任何成员,那么你不需要任何 virtaul 继承,只实现接口(interface)和从基类调用它们。您在 B 中为接口(interface) A 实现的内容也必须在 BB 中实现,然后在 BB 中调用 B:pureVirtual()。否则应该是这样的; (那你应该看看:'class1' : inherits 'class2::member' via dominance)

class A
{
public:
  virtual void f() = 0;
};
class AA : virtual public A
{
public:
  virtual void g() = 0;
};
class AAA : virtual public AA
{
public:
  virtual void h() = 0;
};

class B : virtual public A
{
public:
  void f() override { }
};
class BB : public B, virtual public AA
{
public:
  void g() override { }
};
class BBB : public BB, public AAA
{
public:
  void h() override { }
};

编辑:(无虚拟继承)

class A  //abstract interface
{
public:
  virtual void f() = 0;
};
class AA : public A  //abstract interface
{
public:
  virtual void g() = 0;
};
class AAA : public AA  //abstract interface
{
public:
  virtual void h() = 0;
};

class B : public A // implementation class
{
public:
  void f() override {}
};
class BB : public B, public AA // implementation class
{
public:
  void g() override {}
  void f() override { B::f(); }
};
class BBB : public BB, public AAA // implementation class
{
public:
  void h() override {}

  void g() override { BB::g(); }
  void f() override { BB::f(); }
};

关于C++多菱形继承和纯虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43090204/

相关文章:

C++ 纯虚多重继承?

java - 如何使用枚举定义常量值组

java - 我的类用方法实现接口(interface)。未实现但没有错误

c++ - 如何使用 PhysX 数据计算韦伯数?

c++ - 如何避免 Helgrind 的误报?

c# - 使用受约束的泛型而不是接口(interface)——缺点?

c++ - 关于 C++ 中构造函数(和多重继承)的一些基本问题?

c++ - 使用虚拟继承时强制调用基本构造函数,尽管它永远不会被调用?

c++ - 浮点比较的奇怪结果

c++ - 如何在C++中编写带有小数点的浮点值