作者 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)