作者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 clean();
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();
--
一定是等一下某科期中考压力太大才在这里玩梗...= =
--
'You've sort of made up for it tonight,' said Harry. 'Getting the
sword. Finishing the Horcrux. Saving my life.'
'That makes me sound a lot cooler then I was,' Ron mumbled.
'Stuff like that always sounds cooler then it really was,' said
Harry. 'I've been trying to tell you that for years.'
-- Harry Potter and the Deathly Hollows, P.308
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.28.92
※ 编辑: LPH66 来自: 140.112.28.92 (11/10 14:27)
1F:推 conan77420:推这篇,多型讲的好清楚XD 11/10 19:52
2F:推 iwayne:说得很清楚... good 11/10 20:24
3F:推 VictorTom:推讲解; 顺便祝考试顺利:) 11/10 20:28
4F:推 DemonRing:push 11/11 00:31
5F:推 mynoid:推~~初学者也可以一看就懂 11/11 14:40