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

```

    #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;
    }
    
```

**出力**

```

    vehicle Construct
    bicycle Construct
    vehicle Construct
    motorcar Construct
    motorcycle Construct
    motorcycle Destroy
    motorcar Destroy
    vehicle Destroy
    bicycle Destroy
    vehicle Destroy
    
```

**目標**

```

    vehicle Construct
    bicycle Construct
    motorcar Construct
    motorcycle Construct
    motorcycle Destroy
    motorcar Destroy
    bicycle Destroy
    vehicle Destroy
    
```
CC BY-SA 4.0
2020-03-31T16:53:10.567
65260
2020-03-31T20:33:43.000
2020-03-31T16:54:38.633
3060
39446
question
c++
C++ 複数の派生クラスのオブジェクト生成
`bicycle`と`motorcar`に、それぞれの親の`vehicle`がいて別物なので、別々にコンストラクタが呼ばれています。親クラスをまとめるには`virtual`な継承を使います。

```

    class bicycle : virtual public vehicle{
        // 略
    };
    class motorcar : virtual public vehicle{
        // 略
    };
    
```

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

* * *

ただ`virtual`な継承はオーバーヘッドが大きく、パフォーマンスが悪くなりがちなので、使わないで済むように設計するのが普通だと思います。
CC BY-SA 4.0
2020-03-31T20:33:43.000
65262
2020-03-31T20:33:43.000
3605
65260
answer