C++中virtual継承の深い理解
今日は虚継のものを見ましたが、以前はあまり使ったことがありませんでした。具体的には以下の通りです。
class CParent
{
....
};
:
class CChild : virtual public CParent
{
....
}
すみません、この「virtual」はどういう役割と意味ですか?仮想継承を表し、通常継承はC++の2つの継承方式です。例えばB 1、B 2 Aを継承する CマルチはB 1、B 2を継承する場合、CはAのコピーを2つ含み、それぞれB 1、B 2から来て、仮想継承はAのコピーを1つだけ含む------------------この「virtual」はどんな役割と意味ですか?このCParentがCChildであることを証明します。 の虚基類虚基類 の 虚基類とは、クラスのことです。 SubClass : virtual public BaseClass でvirtual宣言のベースに!C+++は複数の相続をサポートしているので、一つの派生類にはいくつかの直接的な父類があり、いくつかの直接的な父類の中にはそれぞれの一つの基種(つまり父類の親類)から継承される可能性があり、このように最終的な派生類を構成すると、最終的な派生類に複数の同じ基種が含まれている場合があります。この問題を解決するためには、虚基類を使用する必要があります。つまり、この基底類だけに対してメモリ領域を生成する必要があります。このように、最終的な派生類には一つの基類しか含まれません。典型的な必要性は虚基類である場合は、以下の通りです。 A / \ B C \ / Dのうち、DはBCから継承され、BCはそれぞれAから継承されています。だから、AはそれぞれBC仮想継承プログラムによって継承されますか?
class A {
public:
void printA() {cout<<"this is A
";}
};
class B:virtual public A;
class C:virtual public A;
class D:public B,public C;
このようにDで構成された後、その記憶領域にはAが一つしかありません。 d=new D;この時d.printA()を使用すると;大丈夫ですしかし、BとCが虚でなくAから継承されていると、二義的な問題COMの多重継承はバーチャル継承を採用していないため、COMとの互換性がないvtblが発生します。IXとIYが仮想継承方式でIUKnownを継承すると、IXとIYのvtblの中の最初の3つの関数が指すのは、IUKnownの3つのメンバー関数ではない(Con技術の内幕を詳細に見る)IUKnownです。 -> IX ---> CAIUKnown -> IYは通常、1つのタイプのポインタを他のタイプのポインタに変換するが、複数の継承をサポートするためには、C+++はクラスポインタの値を変更しなければならない場合がある。COMにおけるマルチインターフェースの継承はこのようになり、この時CA*pA=new CA();IY*pc=pA コンパイラに変更されます。 IY*pC=(char*)pA+deltaIY(一つのオフセット量);ベースのコンストラクタはまた、クラスの実例的な解析を引き継ぐときに、ベースクラスが使用するリソースをクリアするために呼び出されるvirtualとして定義されるべきである。