2010-09-17 251 views
4

假設我有一個名爲Car的類,另一個名爲SuperCar的繼承自Car的類。我如何確保在SuperCar的構造函數中調用Car的構造函數?我只是做:Car.Car(// args);?構造函數和繼承?

由於

+0

它將被默認調用,或者你想調用爲Car的特殊構造函數創建SuperCar? – DumbCoder 2010-09-17 11:37:35

+0

一個特定的。 (以及一個會類似的論點) – jmasterx 2010-09-17 11:38:23

回答

3

在超級構造添加: Car(... your arguments ...)構造報頭和構造體之間。

爲例,代碼:

#include <iostream> 
using namespace std; 

class Car { 
    public: 
    Car() { } 
    // Oh, there is several constructors... 
    Car(int weight){ 
     cout << "Car weight is " << weight << endl; 
    } 
}; 

class SuperCar: public Car { 
    public: 
    // we call the right constructor for Car, detected by call arguments 
    // relying on usual function overloading mechanism 
    SuperCar(int weight, int height) : Car(weight) { 
     cout << "SuperCar height " << height << endl; 
    } 
}; 

int main(){ 
    SuperCar(1, 10); 
} 

PS:通過調用SuperCarCar一個子類是混亂的方式,你應該避免這種情況。

3

例如:

SuperCar::SuperCar(Parameter p) : Car(p){ 
    //some voodoo... 
} 

如果我沒有記錯

編輯:該死的,KRISS也較快:)

+0

嗯,我不能對我的答案做+1,但我可以給你,他們是一樣的無論如何:-) – kriss 2010-09-17 12:35:13

5

樣品類沒有成員瓦爾。

class Car { 
      Car(); /*If you want default objects*/ 
      Car(/*arg list*/); /* maybe multiple constructors with different, count and 
           type args */ 
}; 

class SuperCar { 
      SuperCar(/*args list*/) : Car(/*arg list*/){/*Constructor Body*/} 
}; 
1

在派生類的構造函數,定義了基類的初始化與所需的參數:

SuperCar(/*params*/) : Car(/*differentParams*/) 
{ 
} 
0

爲此,您可以使用初始化器列表。

SuperCard::SuperCar(args):Car(args){ //Supercar part} 
1

SuperCar構造也會像,

SuperCar(int sayForExample):car(sayForExample),m_SuperCarMember(sayForExample) 
{ 
// constructor definition 
} 

這將調用特定的構造car(int)初始化SuperCar的成員m_SuperCarMember ..

希望它可以幫助..