C++ 複数の派生クラスのオブジェクト生成


vehicleを基底クラスとした、２つの派生クラスbicycle motorcar、またbicycle
とmotorcarを基底クラスとした派生クラスmotorcycle
を用意しました。これら５つのオブジェクトをそれぞれ５つだけ生成したいのですが、vehicle
が２回生成されてしまいます。どのようにすれば良いのか教えてください。

[code]

    #include<iostream>
    using namespace std;
    class vehicle{
        public:
            vehicle(){cout <<"vehicle Construct" << endl;}
            virtual ~vehicle(){cout << "vehicle Destroy" << endl;}
    };
    class bicycle : public vehicle{
        public:
            bicycle(){cout << "bicycle Construct" << endl;}
            virtual ~bicycle(){cout << "bicycle Destroy" << endl;}
    };
    class motorcar : public vehicle{
        public:
            motorcar(){cout << "motorcar Construct" << endl;}
            virtual ~motorcar(){cout << "motorcar Destroy" << endl;}
    };
    class motorcycle : public bicycle, public motorcar{
        public:
            motorcycle(){cout << "motorcycle Construct" << endl;}
            ~motorcycle(){cout << "motorcycle Destroy" << endl;}
    };
    int main()
    {
        motorcycle mymotorcycle;
        return 0;
    }
    
[/code]

**出力**

[code]

    vehicle Construct
    bicycle Construct
    vehicle Construct
    motorcar Construct
    motorcycle Construct
    motorcycle Destroy
    motorcar Destroy
    vehicle Destroy
    bicycle Destroy
    vehicle Destroy
    
[/code]

**目標**

[code]

    vehicle Construct
    bicycle Construct
    motorcar Construct
    motorcycle Construct
    motorcycle Destroy
    motorcar Destroy
    bicycle Destroy
    vehicle Destroy
    
[/code]




`bicycle`と`motorcar`に、それぞれの親の`vehicle`がいて別物なので、別々にコンストラクタが呼ばれています。親クラスをまとめるには`virtual`な継承を使います。

[code]

    class bicycle : virtual public vehicle{
        // 略
    };
    class motorcar : virtual public vehicle{
        // 略
    };
    
[/code]

このように`virtual`を付けた親クラスは全部一つにまとめられます。

* * *

ただ`virtual`な継承はオーバーヘッドが大きく、パフォーマンスが悪くなりがちなので、使わないで済むように設計するのが普通だと思います。




`bicycle`と`motorcar`に、それぞれの親の`vehicle`がいて別物なので、別々にコンストラクタが呼ばれています。親クラスをまとめるには`virtual`な継承を使います。

[code]

    class bicycle : virtual public vehicle{
        // 略
    };
    class motorcar : virtual public vehicle{
        // 略
    };
    
[/code]

このように`virtual`を付けた親クラスは全部一つにまとめられます。

* * *

ただ`virtual`な継承はオーバーヘッドが大きく、パフォーマンスが悪くなりがちなので、使わないで済むように設計するのが普通だと思います。

