2

大きなクラスの最小限のインターフェイスとして機能するいくつかの非常に小さなクラスを含むプロジェクトがあります。これらのインターフェースのいくつかを必要とするオブジェクトがある場合があります。また、これらのインターフェイスが同じ派生基本クラスを共有する場合もあります。すべてのインターフェイスが共有する派生基本クラスのコピーを 1 つだけ持つように、コードを構造化する方法はありますか?

コード例を次に示します。

class A {
public:
  virtual void f(int a)=0;
  virtual int g() const {
    return m_inner;
  }
protected:
  int m_inner;
};

class B : public A {
public:
  virtual void f(int a)=0;
  virtual void h(int b) {
    m_stuff = b;
    m_inner = 0;
  }
protected:
  int m_stuff;
};

class C : public A {
public:
  virtual void f(int a)=0;
  virtual int i() const {
    return m_otherstuff;
  }
protected:
  int m_otherstuff;
};

class D : public B, public C {
public:
  void f(int a) { //do stuff }
  //fill in the rest of a big actual class.
}; 

D には A の 2 つのコピーがあり、A:: の参照はあいまいです。一日の終わりに A のコピーを 1 つだけ取得するようにクラスを構成する最良の方法は何ですか? 私は、A、B、C をどのような方法でも喜んで再構築します。これは可能ですか?

4

3 に答える 3

5

仮想継承が必要です。あなたのケースは典型的なダイヤモンドの問題です。Google や C++ の書籍で簡単に検索すると、関連する情報がたくさん得られます。

于 2012-09-25T04:50:57.270 に答える
2

私は C++ にはあまり興味がありませんが、これがDiamond Problemと呼ばれることは知っています。

そして、これがあなたの解決策です。

于 2012-09-25T04:51:23.140 に答える
1

仮想継承は、差し迫った問題を解決します (既にここで回答済み)。しかし、階層を再考することを強くお勧めします。学術論文や極端なリファクタリングの場合を除いて、仮想継承が使用されているのを見たことがありません。おそらく、継承の代わりに集約を使用することで問題を解決できるかもしれません。

于 2012-09-25T04:53:23.757 に答える