Re: [問題] 多型的問題
※ 引述《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
03/11 23:51, 1F
討論串 (同標題文章)