一、问题
多态性:
多态性分为两类:
静态多态性指在编译期间就已经确定了函数调用和函数代码直接的关系。比如,在编译重载函数和重载运算符函数时,编译器根据它们的参数表,对应相同函数名进行修饰,将它们转化为不同函数名。遇到函数调用语句,根据实参就能够确定使用哪个函数。
动态多态性指程序只有在运行时才能够确定调用哪个函数。比如通过基类的指针或引用调用虚函数。
兼容性规则:
当我们把派生类对象的地址赋给基类指针时,此时基类指针只能调用从基类继承的一部分成员。由此:
1、如果派生类和基类有同名函数area(),当派生类对象调用area()时使用的是派生类中定义的area();当基类对象调用area()时调用的是基类中定义的area();
2、如果派生类和基类有同名函数area(),如果我们把派生类对象地址赋值给基类指针,当基类指针调用area()时只能调用基类中area();如果我们把基类类对象地址赋值给基类指针,当基类指针调用area()时也是调用基类中area()。
这就出现问题,我们希望实现动态性,基类指针进入不同对象时能够调用不同类对象,也就是进入派生类对象调用派生类area(),进入基类调用基类area()。由此引入虚函数解决此问题。
二、虚函数
在基类中定义格式:
virtual 函数类型 函数名(参数)
注意:
1. 派生类中与基类中同原型的函数一定也是虚函数,只是省略virtual
2. 虚函数实现需要以下条件:满足赋值兼容原则,要在基类中声明虚函数,要通过基类指针调用虚函数
3. 内联函数,构造函数,静态成员函数不能定义为虚函数,析构函数可以定义为虚函数
4. 虚函数执行速度慢一下。
三、纯虚函数
当我们声明在基类中的虚函数没有具体要求,只是为了实现多个派生类的多态性时,我们可以将基类中虚函数声明为纯虚函数。此时基类被称为抽象类。
在基类中定义格式:
virtual 函数类型 函数名(参数)=0
注意:
1. 纯虚函数没有实体,只有一个声明,后面带分号
2. 拥有纯虚函数的基类不能被定义为对象,但是可以定义指针或引用
3. 抽象类不能用作函数参数类型,函数返回值,或显式类型转换
4. 派生类必须重载抽象类中纯虚函数,否则它也将被看做一个抽象类。