1.1虚函数和多态
「虚函数」
虚函数可以参与多态,而普通成员函数不能
「多态」
表现形式一:
注意此处被调用的是虚函数,前面类似的例子是通过基类指针调用基类和派生类里面的同名函数(并非虚函数),被执行的就是基类的函数。
表现形式二:
eg.
多态的作用:
在面向对象的程序设计中使用多态,能够增强程序的可扩充性,即程序需要修改或增加功能的时候,需要改动和增加的代码较少
1.2多态实例:魔法门之英雄无敌
游戏版本升级时,要增加新的怪物class CthunderBird,如何编程才能使代码改动和增加量较小?
【基本思路】
非多态
多态
派生类的指针可以赋值给基类对象,CCreature*p参数是基类的指针,调用的实参&wolf是派生类的对象。
1.3几何形体处理程序
=0意味着是纯虚函数
基类的指针数组CShape用来存放各个几何形体,这个数组里的每一个元素都是一个基类指针
由于是基类指针可以指向派生类的对象
排序比较函数qsort
p1实际上是指向指针的指针
【多态的好处】
eg
【在构造函数和析构函数中调用虚函数】
1.4多态的实现原理
“多态”的关键在于通过基类指针或引用调用一个虚函数时,编译时不确定到底调用的是基类还是派生类的函数,运行时才确定----这叫“动态联编”。“动态联编”到底是怎么实现的呢?
【为什么都多了4个字节?】
【虚函数表地址验证】
class a的虚函数表地址替换了b对象里面的class b的虚函数表地址
1.5虚析构函数、纯虚函数
1.5.1虚析构函数
通过基类的指针删除派生类对象时,通常情况下只调用基类的析构函数
但是删除一个派生类对象时,应先调用派生类的析构函数然后再调用基类的析构函数
一般来说,一个类如果定义了虚函数,则应该也将析构函数也定义成为虚函数。或者,一个类打算作为基类使用,也应该将析构函数定义成虚函数
注意:不允许以虚函数作为构造函数
【纯虚函数和抽象类】
在抽象类的成员函数内可以调用纯虚函数,但是在构造函数或者析构函数内部不能调用纯虚函数
如果一个类从抽象类派生而来,那么当且仅当它实现了基类中所有的纯虚函数(实现的意思是指在派生类里写一个和基类的纯虚函数同名同参数表的函数有函数体),它才能成为非抽象类