わかりましたので、すべてのクラスを完全に制御できる場合に死のダイヤモンドの継承の問題を解決する方法を理解していますが、両方から継承する最後のクラスのみを制御できる場合はどうなるでしょうか。
class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};
また、B と C を編集する方法がなく、D のみを編集できます。これを行う簡単な方法はありますか?
わかりましたので、すべてのクラスを完全に制御できる場合に死のダイヤモンドの継承の問題を解決する方法を理解していますが、両方から継承する最後のクラスのみを制御できる場合はどうなるでしょうか。
class A {};
class B : public A {};
class C : public A {};
class D : public B, public C {};
また、B と C を編集する方法がなく、D のみを編集できます。これを行う簡単な方法はありますか?
B
これは、強制しC
て共有することができない非常に正当な理由ですA
。検討:
struct A {int i;};
struct B : A {
B(){i=3;}
void foo() {
//crash if i!=3
}
};
struct C : A {
C(){i=4;}
void bar() {
//crash if i!=4
}
};
B
そしてC
良いクラスです。彼らは、自分が入り込めない状況に対処できません (i の値が無効です)。
あなたが求めていること ( struct D:B,C
、 where B
、およびC
share A
) を実行する方法があった場合、 の値はどうなりますD::A::i
か?
仮想継承とは、「このクラスが必要ですが、有効な値は必要ありません。他の誰かがそれをいじっても完全に問題ありません」という意味です。