簡體   English   中英

C ++多鑽石繼承和純虛函數

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

考慮以下架構:

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中的內容)

如果A AA AAA實際上只是接口,我的意思是他們沒有任何成員,那么你不需要任何virtaul繼承,只實現接口並從基類調用它們。 您在B中界面中的實現什么,一定要在BB還實施,然后調用B:pureVirtual()BB 否則應該是這樣的; (然后你應該看一下: '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 { }
};

編輯:(沒有虛擬繼承)

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