次のクラスがあるとします。
class Base {
virtual void func() { cout << "func base" << endl; }
};
class A : virtual public Base {
public:
virtual void func() { cout << "func A" << endl; }
};
class B : virtual public Base {
public:
virtual void func() { cout << "func B" << endl; }
};
class C : public A, public B {
C(bool is_a);
public:
virtual void func() { // Call appropriate parent's func here }
};
私の要件は、func()
Cを呼び出すときに適切な親クラスの関数を呼び出すことfunc()
です。これは私が適切に意味するものです:
Base* ptr = new C(true /*is_a*/);
ptr->func(); // This should call A's func internally
これを達成する方法は?それも可能ですか?
[編集]
これは、設計上の問題である可能性があります。クラスCには、真の親(AまたはB)が1つしかないことが知られています。そして、どちらが親であるかに応じて、その関数を呼び出したいと思います。代替の設計提案は大歓迎です。
AとBの両方が共有し、基本クラスの一部にはできない共通の機能がいくつかあるため、AとBからCを派生させています。
これは、設計上の問題である可能性があります。クラスCには、真の親(AまたはB)が1つしかないことが知られています。そして、どちらが親であるかに応じて、その関数を呼び出したいと思います。代替の設計提案は大歓迎です。
class Base { };
class A : public Base { };
class B : public Base { };
class C
{
// common interface for all types of C
};
class C_A : public A, public C { };
class C_B : public B, public C { };
これでC_A
、C
必要に応じてA
、C_B
同様に動作する必要がある場所で、を使用できます...
上記の例では、すべての仮想継承が削除されており、そのままでは必要ありません。ユースケースに応じて、クラスC
自体をBaseから継承させることが適切な場合と適切でない場合があります。もしそうなら、すべてを聞かせてA
、B
そしてC
基地からほぼ継承します。C_A
そしてC_B
、しかし、彼らの両親から事実上継承する必要はありません(まだ一つだけが存在しますBase
基底クラスの仮想継承に起因して継承されたインスタンスを)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加