【问题标题】:C++ multiple diamonds inheritance and pure virtual functionsC++ 多菱形继承和纯虚函数
【发布时间】:2017-03-29 09:55:53
【问题描述】:

考虑以下架构:

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的覆盖,BBB使用BB定义的g的覆盖)。

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

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

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

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

【问题讨论】:

  • 我认为,您的类定义中缺少虚拟修饰符,否则您的整个问题没有意义。细节很重要
  • 当然,我指的是函数的虚拟修饰符

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


【解决方案1】:

如果A AA AAA 真的只是接口,我的意思是它们没有任何成员,那么你不需要任何virtaul 继承,只实现接口并从基类调用它们。你在 B 中为接口 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(); }
};

【讨论】:

  • 但是 void g() override { BB::g(); } 是 g 的覆盖,它只是调用 BB 的覆盖。我们不能直接说我们想直接使用 BB 对 g 的定义吗?这样实现 BBB 的用户就不会试图篡改 g。
  • @MarsyaKaustentein 如果你想在BBB:g() 中实现任何其他东西,你可以。如果你不想在BBB 中实现g() and f() 不,你不能。因为那样它将是抽象类,你不能有 BBB 实例。
猜你喜欢
  • 2015-08-07
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
相关资源
最近更新 更多