多态
1.意义
- 接口的多种不同实现方式
- 多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数
- 面向对象中的表述:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法);
- 也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同行为就是指不同的实现,即执行不同的函数
2.实现
#include <iostream>
#inlcude <string>
using namespace std;
class Box{
public:
Box(int,int,int);
virtual void display();
protected:
int length,height,width;
};
//省略类成员函数实现
class FilledBox:public Box{
public:
FilledBox(int,int,int,string);
virtual void display();
private:
int weight;
string fruit;
};
int main(){
Box box(1,2,3);
FilledBox fbox(2,3,4,5,"apple");
Box *pt=&box;//指向基类对象的指针变量
pt->display();
pt = &fbox;//基类指针指向派生类对象;
//在派生类的虚函数表中,派生类的虚函数取代了基类原来的虚函数,因此在使用基类指针指向派生类对象后,调用虚函数时就调用了派生类的虚函数;P157《深度探索C++对象模型》
pt -> display();
return 0;
}
3.纯虚函数
- 纯虚函数:在基类中声明,没有定义,但要求任何派生类都要定义自己的实现方法。
- 在函数原型后加“ =0 ”
virtual void function() = 0;
- 虚函数定义:
virtual void function();
将函数定义为虚函数,则编译器要求在派生类中必须予以重载以实现多态性。
含有纯虚函数的类为抽象类,不能生成对象。
抽象基类不能被直接调用,必须被子类继承重载以后,再根据要求调用子类的方法,且在子类中一定要实现纯虚函数的定义,不然编译时会出错。
4.虚析构函数
1.构造函数不能声明为虚函数,Why?
- 因为编译器在构造对象时,必须知道确切类型,才能正确地生成对象;
- 其次,在构造函数执行之前,对象并不存在,无法使用指向此对象的指针来调用构造函数。
2.析构函数可以声明为虚函数,WHhy?
- C++明确指出,当派生类对象经由一个基类指针被删除、而该基类带有一非虚析构函数,会导致对象的派生部分没被销毁掉。
- 例子: P62《后台开发:核心技术与应用实践》