Re: [問題] 多型的問題

看板C_and_CPP作者 (())時間12年前 (2012/03/10 02:50), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/3 (看更多)
※ 引述《pracinverse (改)》之銘言: 手癢~有些地方改寫了, 你參考看看, 可能沒有前面幾位那麼簡捷... #include <iostream> #include <cstring> using namespace std; enum FoodType { Unknown = 0, Beef, Lamb, Chicken, Coke, Tea }; struct IFood { virtual void Create(bool bIce) = 0; virtual char* GetName() = 0; virtual int GetPrice() = 0; protected: char m_FoodName[32]; FoodType m_FoodType; int m_FoodPrice; bool m_bIsDrink; }; struct CDefaultFood : public IFood { CDefaultFood() { strcpy(m_FoodName, "Food"); m_FoodType = Unknown; m_FoodPrice = 0; m_bIsDrink = false; } virtual void Create(bool bIce = false) { cout << "Creating food " << m_FoodName << " ..." << endl; } virtual char* GetName() { return m_FoodName; } virtual int GetPrice() { return m_FoodPrice; } }; struct CDefaultDrink : public IFood { CDefaultDrink() { strcpy(m_FoodName, "Drink"); m_FoodType = Unknown; m_FoodPrice = 0; m_bIsDrink = true; } virtual void Create(bool bIce = false) { cout << "Creating drink " << m_FoodName << (bIce ? " with" : " without") << " ice ..." << endl; } virtual char* GetName() { return m_FoodName; } virtual int GetPrice() { return m_FoodPrice; } }; struct CBeef : public CDefaultFood { CBeef() { strcpy(m_FoodName, "Beef"); m_FoodType = Beef; m_FoodPrice = 1000; } }; struct CLamb : public CDefaultFood { CLamb() { strcpy(m_FoodName, "Lamb"); m_FoodType = Lamb; m_FoodPrice = 500; } }; struct CChicken : public CDefaultFood { CChicken() { strcpy(m_FoodName, "Chicken"); m_FoodType = Chicken; m_FoodPrice = 100; } }; struct CCoke : public CDefaultDrink { CCoke() { strcpy(m_FoodName, "Coke"); m_FoodType = Coke; m_FoodPrice = 25; } }; struct CTea : public CDefaultDrink { CTea() { strcpy(m_FoodName, "Tea"); m_FoodType = Tea; m_FoodPrice = 10; } }; void OrderFood(FoodType foodType, bool bIce = false) { IFood* pFood = NULL; switch (foodType) { case Beef: pFood = new CBeef(); break; case Lamb: pFood = new CLamb(); break; case Chicken: pFood = new CChicken(); break; case Coke: pFood = new CCoke(); break; case Tea: pFood = new CTea(); break; } if (pFood) { pFood->Create(bIce); cout << "Name: " << pFood->GetName() << endl; cout << "Price: " << pFood->GetPrice() << endl; delete pFood; } } int main(int argc, char* argv[]) { OrderFood(Beef); OrderFood(Lamb); OrderFood(Chicken); OrderFood(Coke); OrderFood(Tea); OrderFood(Coke, true); OrderFood(Tea, true); return 0; } 執行結果: Creating food Beef ... Name: Beef Price: 1000 Creating food Lamb ... Name: Lamb Price: 500 Creating food Chicken ... Name: Chicken Price: 100 Creating drink Coke without ice ... Name: Coke Price: 25 Creating drink Tea without ice ... Name: Tea Price: 10 Creating drink Coke with ice ... Name: Coke Price: 25 Creating drink Tea with ice ... Name: Tea Price: 10 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.204.118.195

03/11 23:51, , 1F
THANKS
03/11 23:51, 1F
文章代碼(AID): #1FMb3fY9 (C_and_CPP)
文章代碼(AID): #1FMb3fY9 (C_and_CPP)