0

基本クラス B、派生クラス D、派生派生クラス DD があるとします。現在のオブジェクトの直接の親のインスタンスを取得するにはどうすればよいですか?

例えば

DD dd;
if (condition )
  dd->myfunction();
else
  d = getcurrentparent(); // this should give the current parent, here D d;

編集:

わかりました、シナリオを追加しています。

メニューのようなものです。そして、各メニューは異なるクラスです。

メイン メニュー - 基本クラス サブ メニュー - 派生クラス サブ サブ メニュー - 派生派生クラス。

サブサブメニューをトラバースするとき、現在の obj の直接の親を知る必要があります (サブサブメニューからサブメニューに戻るなど)。

4

3 に答える 3

2

がある場合はDD dd;、参照に割り当てるだけで、その基本クラスのいずれかへの参照をいつでも取得できます。

DD dd;
D& d = dd;

ただし、派生オブジェクトはベースオブジェクトが実行できるすべてのこと(およびそれ以上)を実行できるため、なぜこれを実行するのかわかりません。

于 2012-11-01T10:47:44.023 に答える
1

このようなことを試してみてください。

class D : public B
{
   virtual const char * GetParent()
   {
       return "B";
   }

    // other stuff....
}

class DD : public D
{
   virtual const char * GetParent()
   {
       return "D";
   }

   // other stuff....
}

これがあなたの望むものであることを願っています。なんでそんなものが必要なの?階層を持つオブジェクトレジストリのようなものを作成していますか?

- 編集 -

D * d = ⅆ または、本当に必要な場合は、DD オブジェクトを D オブジェクトにコピーするコピー関数を作成します。しかし、私が推測するのは、あなたが正しく質問していないということです。

ps初めて質問を間違って読んで申し訳ありません。

- 編集 -

わかりました、必要なのは複合デザインパターンです。UML ダイアグラムが示すように、それほど複雑ではありません。一度実装すると、他のものをコーディングするのは本当に簡単です。デザインパターンについて話すとき、私は「ダミーのためのデザインパターン」という本が好きです。設計パターンを非常にうまく説明し、複合設計パターンを非常によく説明しています。ヘルプが必要な場合は、コメントをお願いします。しかし、最初に自分でやってみてください。:) 楽しい。ウィキペディア リンク : http://en.wikipedia.org/wiki/Composite_pattern

--編集-- 複合 DP は次のようになります。 複合設計パターン

あなたのシナリオがコンソールの非常に単純なメニューであると仮定すると、私はこのようにします.

  • Leaf==>MenuItemクラス
  • Composite==>Menuクラス
  • +operation()==>Select()両方のクラスの機能。この関数は仮想であり、MenuクラスとMenuItemクラスでオーバーライドして、項目をそれぞれ表示/展開および選択する必要があります。
  • MenuクラスにはGoBack()親メニューへの機能があります
于 2012-11-01T11:04:07.657 に答える
1

良い考えではありません。上で提案されたことを行うことができますが、それは良い設計上の選択ではありません。また、複数の継承 (または複数のインターフェイス) の場合、どの親が必要ですか?

于 2012-11-01T11:07:22.460 に答える