-2

この「基本」クラスは、b、medium1、およびmedium2を構成します。「トップ」クラスを使用すると、2倍以上構築されます。合計5回作成(画面に5回書き込み)。

質問: 「base」クラスで何を変更して、一度だけ構築できるようにすることができますか?

#include "stdafx.h"
#include<stdlib.h> 

class base
{
public:
    base(){x=5;printf(" %i ",x);}
    int x;
}b;

class medium1:public base{}m1;

class medium2:public base{}m2;

class top:public medium1,medium2{};


int main() {
    top ten;
    getchar();
    return 0;
}

仮想基本クラスの落とし穴は何ですか?私のささいな質問に答えてくれてありがとう。

4

5 に答える 5

6

base元の 5 つの構築すべての代わりに、1 回だけ構築することはできません。プログラムには、サブオブジェクトを含む4 つの完全なオブジェクトがありますbase。これは、何をしても、少なくとも4 つの base構造を持つことを意味します。

さらに、他の回答で言及されている仮想継承を使用するという提案は、実際にはクラスではなく他のbaseクラスに変更を加える必要があります。一方、あなたの質問は、に変更を加える必要があると主張していますbase

于 2012-08-14T21:26:09.910 に答える
5

これは、クラスbaseを作成するときに一度だけ構築されます。top

class medium1:virtual public base{};
class medium2:virtual public base{};

b残りは、オブジェクト、m1およびを作成するという事実に由来しますm2。基本クラスのデストラクタの呼び出しを実際に防ぐことはできません。これは、コンパイラに指示することだからです。オブジェクトを作成したくない場合はbase、そこから派生しないでください。

于 2012-08-14T21:23:28.760 に答える
2

virtualそれを基底クラスにすることもできますが、それには大きな落とし穴 があります

于 2012-08-14T21:23:29.557 に答える
1

base仮想継承を使用する場合、単一のクラス オブジェクトを持つことができます。

class medium1:virtual public base{}m1;

class medium2: virtual public base{}m2;
于 2012-08-14T21:23:48.683 に答える
1

これにより、呼び出しが 2 つに減りますが、二重継承があるため、これが最善だと思います。定義で変数を削除するbと、baseそこにいます。 http://codepad.org/pn016D7b

#include<stdlib.h> 

class base
{
public:
    base(){x=5;printf(" %i ",x);}
    int x;
}b;

class medium1:virtual public base 
{
public:
    medium1():base(){};
};

class medium2:virtual public base{};

class top:virtual public medium1,medium2{};


int main() {
    top ten;
    getchar();
    return 0;
}
于 2012-08-14T21:34:32.553 に答える