2012-04-02 58 views
6

我對C++相當陌生,但我遇到了一個我似乎無法解決的問題。 我會用汽車來說明問題,只是爲了讓事情變得簡單。 好吧,讓我們說我有一個基類汽車,我有不同的品牌,從該類繼承。像這樣:C++從基類實例調用派生函數

class Car 
{ 
    public: 
     Car(); 
}; 

class Ford: public Car 
{ 
    public: 
     Ford(); 
     void drive(); 
     void park(); 
}; 

整個想法是把所有這些不同的汽車放在一個單獨的汽車類型的向量中。像這樣:

vector<Car*> cars; 
cars.push_back(new Ford()); 
cars.back()->drive(); //this won't work 

我該如何調用基類實例的派生函數?請注意,我想把這些全部放在一個矢量中。其原因是因爲我只想使用已添加的最後一個派生汽車類實例(在這種情況下,派生汽車類是ford)。另請注意,所有的汽車類別都具有相同的功能。

回答

7

如果這些函數對於所有派生類都是真正普遍的,那麼你有一個通用接口,所以你應該通過基類來表達它。要做到這一點,你聲明這些函數爲純虛:

class Car { 
public: 
    virtual void drive() = 0; // Pure-virtual function 
}; 

class Ford : public Car { 
public: 
    virtual void drive() { std::cout << "driving Ford\n"; } 
}; 

... 

vector<Car*> cars; 
cars.push_back(new Ford()); 
cars.back()->drive(); //this will work 

[在一個側面說明,它通常被認爲是不良的做法有原始指針的載體,因爲它使內存管理技巧。你應該考慮使用智能指針。]

+0

非常感謝大,響應速度快,這並獲得成功。 – Dan 2012-04-02 11:51:52

2

如果所有Car類具有相同的功能,然後把它們聲明在基類Carvirtual

class Car 
{ 
public: 
    Car(); 
    virtual ~Car(); 
    virtual void drive() = 0; 
    virtual void park() = 0; 
}; 

這將允許使用vector張貼工作示例代碼。

0

可能如果可能的話,你可以定義基類

class Car 
{ 
    public: 
     Car(); 
     virtual void drive(); 
}; 
0

你必須定義喜歡的界面:

class Car{ 
public: 
Car(); 
virtual void moveForward(unsigned int speed) = 0; 
virtual void moveBack(unsigned int speed) = 0; 
//... 
virtual ~Car(); 
}; 

不要忘記,使析構函數虛。 之後,你只需要在你的子類中實現這些方法,並在之後調用它們。 同樣在矢量中,您可以使用shared_ptr或直接傳遞實例。

3

您有兩種選擇:在Car定義中放置虛擬驅動器()方法,或將Car指針投射到福特指針。有機會,你會想要做第一個。

class Car 
{ 
    public: 
     Car(); 
     virtual void drive() { // default implementation} 
}; 

現在你可以開車()你的車!您也可以使驅動器()純虛函數,像這樣:

class Car 
{ 
    public: 
     Car(); 
     virtual void drive() = 0; 
}; 

這基本上意味着,沒有用於驅動器()沒有默認的實現:它必須在子類中重新實現。我提到的第二種方式,其中,同樣,你可能不希望,但必須包括的完整性,是投指針:

static_cast<Ford*>(cars.back())->drive(); 

這隻能如果你事先知道,這輛車是福特但是,在這種情況下並沒有多大用處。你也可以看看dynamic_cast。

+0

是的,我將使用第一種方法,但很高興知道有另一種方法。謝謝(你的)信息! – Dan 2012-04-02 11:53:23

+0

@Anthony,我認爲對於第二種方法,最好使用dyanamic_cast而不是static_cast – exs 2018-02-27 20:21:24

相關問題