class foo : public virtual bar, public virtual kung
{
// implementation of the method of the above inherited class
};
bar and kungクラスは、fooクラス内に実装された純粋仮想メソッドを含む抽象クラスです。
これの用途は何ですか?
class foo : public virtual bar, public virtual kung
{
// implementation of the method of the above inherited class
};
bar and kungクラスは、fooクラス内に実装された純粋仮想メソッドを含む抽象クラスです。
これの用途は何ですか?
あなたの場合、barとkungのメソッドが衝突しない限り、barとkungが最も派生した基本クラスであるかどうかは違いはありませんが、衝突した場合、つまり、あいまいな定義でのコンパイラからのエラーはわかります。
これについての詳細はc++のFAQで:http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.9
他の将来のクラスfoo
が複数の方法で派生する場合、最も派生したクラスには、仮想基本クラスとが1 つだけ含まれます。bar
kung
struct A : foo { };
struct B : foo { };
class Gizmo : public A, public B { }; // only *one* bar and kung base class.
タイプ のオブジェクトは、派生パスごとに 2 つの別個のものではなく、Gizmo
タイプ の固有の基本サブオブジェクトを持ち、bar
についても同様です。kung
クラスに純粋仮想関数のみがあり、非静的メンバーがなく、同じ性質の基本クラスのみがある場合、クラスは空であるため、仮想継承と非仮想継承の間に実質的な違いはないことに注意してください。他の下位言語では、そのようなクラスを「インターフェース」と呼びます。つまり、そのような言語は一般的なクラスの多重継承をサポートしていませんが、多重継承しても問題ありません。
こうすることで、fooクラスはイサバーとイサクン。
bar オブジェクトを取る関数またはメソッドがある場合、foo クラスのインスタンス化は資格があります。bar クラスには純粋な仮想メソッドがあるため、オブジェクトがインスタンス化されている場合、コンパイラはメソッドを定義するために foo (または foo から派生したクラス) を必要とします。バー オブジェクトを受け取るコードは、オブジェクトが foo クラス (または foo から派生したクラス) のインスタンスであっても、渡されたバー オブジェクトがそのメソッドを実装していることを知っていることに依存できます。
カンクラスも同様。
そのため、foo クラスが bar と kung のすべての純粋仮想メソッドを実装している場合 (コンパイラは foo オブジェクトをインスタンス化するためにこれを必要とします)、foo オブジェクトは、bar、kung、または foo オブジェクトを必要とするものに渡すことができます。