四、类和对象(五)

1.多态的基本概念

分为两类

静态多态:函数重载和运算符重载属于,复用函数名

动态多态:派生类和虚函数实现运行时多态

区别

静态多态的函数地址早绑定,编译阶段确定函数地址

动态多态的函数地址晚绑定,运行阶段确定函数地址

父类成员函数前面加virtual 叫做虚函数,就会实现动态多态

class Animal{ virtual  speak()};

class Cat:public Animal{ speak()};

class Dog:public Animal{ speak()};

动态多态满足条件

有继承关系

子类要重新写父类的虚函数(重写:返回值类型,函数名,参数表完全相同)

使用         用父类的引用或者指针执行子类对象

vsptr 虚函数(表)指针,指向一个虚函数表vftable

子类重写父类的虚函数时,子类中的虚函数表内部会替换成子类的虚函数地址

当父类的指针或者引用子类对象时,就会发生多态

2.多态的优点

代码组织结构清晰

可读性强

利于前期和后期的扩展和维护

开发中提倡开闭原则

对扩展进行开发,对修改进行封闭

3.纯虚函数和抽象类

在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容,因此可以将虚函数改为纯虚函数

语法  virtual 返回值类型 函数名 (参数表) = 0;

当类中有了纯虚函数,这个类也称为抽象类

抽象类特点

无法实例化对象(不能用这个类建立新的对象)   

子类必须重写抽象类中的纯虚函数,否则也属于抽象类

4.虚析构和纯虚析构

使用多态时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码

解决方法  将父类中析构函数改为虚析构或者纯虚析构

虚析构和纯虚析构

共性

可以解决父类指针释放子类对象

都需要有具体的函数实现

区别       

如果是纯虚析构,该类属于抽象类,无法实例化对象

纯虚析构函数需要声明,也需要在类外实现

有了纯虚析构,这个类也属于抽象类,无法实例化对象

虚析构语法 virtual ~类名(){}

纯虚析构语法  virtual ~类名()=0;//声明

              类名::~类名(){}  //实现

总结

虚析构或者纯虚析构就是用来解决父类指针在释放子类对象

如果子类中没有堆区数据,可以不写为虚析构或者纯虚析构

有了纯虚析构,这个类也属于抽象类,无法实例化对象

你可能感兴趣的:(c++编程,开发语言,c++,算法)