要正確使用繼承你會想要做這樣的事情:
#include <iostream>
#include <vector>
class Fruit
{
public:
virtual void Eat()
{
std::cout << "Mmm.. a fruit!" << std::endl;
}
virtual ~Fruit() {}
};
class Apple : public Fruit
{
public:
void Eat()
{
std::cout << "Mmm.. an apple!" << std::endl;
}
};
class Pear : public Fruit
{
public:
void Eat()
{
std::cout << "Mmm.. a pear!" << std::endl;
}
};
int main()
{
std::vector<Fruit *> fruits;
fruits.push_back(new Pear());
fruits.push_back(new Apple());
fruits.push_back(new Fruit());
for (int i = 0; i < fruits.size(); i++)
fruits[i]->Eat();
return 0;
}
你需要,以便採取動態調度的優勢,使用指針的基類(水果*)。否則,它只會調用Fruit的Eat()方法。
我的答案中的示例允許從Fruit派生的類覆蓋Eat()(如果他們想要的話),但這不是必需的。如果您將虛函數設爲純函數,那麼派生類必須實現它。
class Fruit
{
public:
// Cannot instantiate this class, and derived classes must provide this
virtual void Eat() = 0;
};
都會響起Donotalo的評論,你想要的功能可以實現爲:
class FruitCollection
{
private:
std::vector<Fruit *> fruits;
public:
void Add(Fruit *fruit);
};
void FruitCollection::Add(Fruit *fruit)
{
fruits.push_back(fruit);
}
這是在大多數情況下可能是矯枉過正,你可能會需要遠遠更多的操作比這個非常簡單例。
學習一些C++基礎知識可能會有所幫助:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – 2011-04-09 02:13:32
「我試過」,「它失敗了」和「我得到了很多錯誤「是沒有信息的。向我們展示「我試過」代碼中的內容,並告訴我們「失敗」以及「很多錯誤」是什麼,我們可以幫助解決它。否則,這不是一個真正的問題。 (如果你沒有100多個問題,我認爲你正在尋找作業幫助 - 也許你是?) – 2011-04-09 02:35:39
不要在你的'fruit'基類中放置一個函數「addFruit()」。每個水果可以具有(例如)顏色,平均重量等等,但是不應該有一種方法「將我添加到某種水果矢量中」。在'fruit'類之外創建這樣的方法(並且在每個派生類之外) – 2017-08-28 13:32:03