[教學][轉錄]多型
作者 LPH66 ((short)(-15074)) 看板 C_and_CPP
標題 Re: [問題] class 的object
時間 Tue Nov 10 14:26:53 2009
───────────────────────────────────────
※ 引述《Dreamer77 (追夢)》之銘言:
: [問題2]
: 如果B繼承A
: 書上總是舉這個例子
: A *a = new A();
: A *b = new B();
: 用於解釋memeber function 會如何被呼叫 以及virtual的相關問題
: 但我不理解的是為什麼不宣告成
: B *b = new B();
: 宣告成A *b = new B(); 相較起來會有什麼用途嗎
: 謝謝
推文好像有點慢
例如這樣:
class Car {public: virtual void drive();
virtual void clean();};
class Benz : public Car {public: void drive();
void playMovie(Movie *m);};
class Toyota : public Car {public: void drive();
void clean();};
class Hyundai : public Car {public: void drive();
void clean();
void openTopWindow();};
那我只要知道我拿到一個 Car * 就可以 drive()
像是:
void GoTraveling(Car *mycar)
{
mycar.drive();
}
我甚至不需要在這裡就知道它其實是 Benz * 還是 Toyota * 還是 Hyundai *
又或者是一個停車場 Car *parkingLot[10];
我可以讓三種車都停進去:
Benz *Sanzenin = new Benz();
Toyota *Katsura = new Toyota();
Hyundai *Nishizawa = new Hyundai();
parkingLot[0] = Sanzenin;
parkingLot[1] = Katsura;
parkingLot[2] = Nishizawa;
那某個管理員想要清理車子:
Car *Tennousu;
for(i=0; i<=2; i++)
{
Tennousu=parkingLot[i]; //雖然 parkingLot[i]->clean(); 也可以
Tennousu->clean(); //不過這樣就沒梗了(誤)原PO應該會比較能理解....
}
就可以很方便的跑完
這個就是推文裡說的「多形」
好像旋風管家的梗用的有點多...囧>
當然有些特定功能就不能用
像 Benz 裡多了 playMovie() Hyundai 裡多了 openTopWindow()
這樣雖然我們有
Movie *FourteenthTarget=Tachibana.rent("Fourteenth Target");//這裡是柯南梗 囧>
管理員卻沒辦法用 Tennousu->playMovie(FourteenthTarget); //compile error
或是 Tennousu->openTopWindow(); //compile error too
因為她只知道 Car 該有的東西
但知道它是 Benz * 的管家就可以放電影給大小姐看:
Benz *Ayasaki = dynamic_cast<Benz *>(parkingLot[0]);
Ayasaki->playMovie(FourteenthTarget); //ok
知道它是 Hyundai * 的人也可以打開天窗:
Hyundai *Hamster = dynamic_cast<Hyundai *>(parkingLot[2]);
Hamster->openTopWindow();
--
我們每個人都有罪,犯著不同的罪;我能決定誰對,誰又該要沉睡—以父之名
每個人為不同的理由戴著面具說謊,動機也只有一個名字那叫做慾望—夜的第七章
沒有人是乾淨的—醫生杜明
歡迎大家上我的“部落格”:http://coldstar.5d6d.com/forum-2-1.html
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.241.120
※ 編輯: WGL 來自: 140.112.241.120 (01/12 12:26)