在子類中,我需要複製基類中的字段。一個簡單的例子:如果我們有一個基類Car
,我想製作一輛名爲DoubleCar
的汽車,它代表兩輛車中的一輛(有兩個引擎,八個車輪等)。這個DoubleCar
就像一輛汽車(我們可以啓動它,加速,剎車等等),所以繼承似乎很自然。我嘗試做它通過以下方式如何從基類C++複製字段
class Engine{
public: void Start(){}
};
class Car
{
Engine* engine;
public:
Car(Engine* engine){this->engine=engine;}
virtual void Start(){engine->Start();}
};
,創造DoubleCar
擁有的第一輛車從基類和secondCar
爲現場:
class DoubleCar : public Car
{
Car* secondCar;
public:
DoubleCar(Engine* e1, Engine* e2) : Car(e1)
{secondCar = new Car(e2);}
virtual void Start(){Car::Start(); secondCar->Start();}
};
該解決方案看起來醜陋,它看起來像一個汽車比另一個更重要。我也試圖把兩輛車都放在田裏,而忽略底座成員,像這樣
class DoubleCar1 : public Car
{
Car *firstCar, *secondCar;
public:
DoubleCar1(Engine* e1, Engine* e2) : Car(NULL)
{firstCar = new Car(e1); secondCar = new Car(e2);}
virtual void Start(){firstCar->Start(); secondCar->Start();}
};
這也不是一個好的解決方案。對於這樣的問題,什麼是一個好的設計?當然,在我真正的問題中,我很少有父母Car
和幾個孩子,所以我在一棵樹的中間。
'因此看起來很自然的做一個繼承'看起來像你很快跳到這個結論:/特別是因爲你繼續使用半繼承,然後假裝繼承! –
'DoubleCar'應該和'Car'有相同的功能,這就是爲什麼我會得出這個結論。 – Dejan
@petar爲了您的代碼使用['std :: shared_ptr's](http://en.cppreference.com/w/cpp/memory/shared_ptr)而不是自己處理原始指針 – Mgetz