简体   繁体   English

C ++多钻石继承和纯虚函数

[英]C++ multiple diamonds inheritance and pure virtual functions

Consider the following architecture: 考虑以下架构:

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

As such, BB and BBB are virtual classes, because f is not overridden by BB, and neither f nor g are by BBB. 因此, BBBBB是虚拟类,因为f不会被BB覆盖,并且f和g都不是BBB。 My wish is to be able to instantiate BB and BBB (so that BB and BBB use the override of f defined by B, and BBB uses the override of g defined by BB). 我的愿望是能够实例化BB和BBB(因此BB和BBB使用由B定义的f的覆盖,并且BBB使用由BB定义的g的覆盖)。

The question is: which inheritance relationships should be marked as virtual to instantiate BB and BBB ? 问题是: 应该将哪些继承关系标记为virtual实例化BBBBB

The inheritance diagram should ideally look like this: 理想情况下,继承图应如下所示:

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

The idea behind this design is that A, AA and AAA are interfaces describing incremental feature levels. 这种设计背后的想法是A,AA和AAA是描述增量功能级别的接口。 B, BB and BB are one corresponding incremental implementation. B,BB和BB是一个相应的增量实现。 (So that BB for instance defines everything needed by AA, and also features what's in B) (因此BB例如定义了AA所需的一切,并且还具有B中的内容)

if A AA AAA are really only interfaces, i mean they don't have any members, then you don't need any virtaul inheritance, implement only interfaces and call them from base classes. 如果A AA AAA实际上只是接口,我的意思是他们没有任何成员,那么你不需要任何virtaul继承,只实现接口并从基类调用它们。 What you implemented in B for interface A, must be implemented also in BB, then call B:pureVirtual() in BB . 您在B中界面中的实现什么,一定要在BB还实施,然后调用B:pureVirtual()BB Otherwise should be like this; 否则应该是这样的; (Then you should have a look at: 'class1' : inherits 'class2::member' via dominance ) (然后你应该看一下: 'class1':通过dominance继承'class2 :: member'

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

Edit: (Without virtual inheritance) 编辑:(没有虚拟继承)

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM