C++中virtual継承の深い理解

2031 ワード

今日は虚継のものを見ましたが、以前はあまり使ったことがありませんでした。具体的には以下の通りです。 

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として定義されるべきである。