多态,纯虚函数,虚析构,纯虚析构

您所在的位置:网站首页 纯虚函数怎么调用 多态,纯虚函数,虚析构,纯虚析构

多态,纯虚函数,虚析构,纯虚析构

2023-06-12 21:07| 来源: 网络整理| 查看: 265

类和对象—多态

1.多态的基本语法 多态是C++面向对象的三大特性之一。 多态分为两类 静态多态:函数重载和运算符重载属于静态多态,复用函数名。 动态多态:派生类和虚函数实现运行多态。

静态动态和多态动态的区别: 静态多态的函数地址早绑定-编译阶段确定函数地址。 动态多态的函数地址晚绑定-运行阶段确定函数地址。

#include using namespace std; class Animal { public: //speak函数就是虚函数 //函数前面加上virtual关键字,变成虚函数, //那么编译器在编译的时候就不能确定函数调用了 virtual void speak() { cout cout cout cat c; Animal a; doSpeak(c);//将Animal中的speak变成虚函数后,这里的输出就是猫在叫。 return 0; }

多态使用满足的条件: //1.有继承关系。 //2.子类重写父类的虚函数。 //3.父类的指针或引用指向了子类对象。

纯虚函数和抽象类 纯虚函数

在多态中,通常父类的虚函数实现是毫无意义的,主要是调用子类重写的内容。因此可以将虚函数改为纯虚函数。 1.纯虚函数的形式: virtual () =0; 2.通常在一个基类中声明纯虚函数,在该基类的派生类中都重新定义该函数。 3.纯虚函数的特点及用法: (1)纯虚函数没有函数体的特殊虚函数,在声明时,将"=0"写在虚函数原型的后面,表示一个纯虚函数。 (2)纯虚函数不能被调用,因为他只有函数名,而无具体实现的代码,不能实现特定的功能。除非在该函数的派生类中具体定义了该函数才能被调用。 (3)虚函数用于基类给派生类提供了一个函数原型,统一的接口为实现动态多态性打下基础,派生类需要根据给出的纯虚函数的具体实现代码。 当类中有了纯虚函数,这个类也称为抽象类

抽象类

*无法实例化对象。 *子类必须重写抽象类中的纯虚函数。 代码片段:

#include using namespace std; class Base { public: //纯虚函数 //类中只要有一个纯虚函数就被称为抽象类 //抽象类无法实例化对象 //子类必须重写父类中的纯虚函数,否则也属于抽象类 virtual void func()=0; }; class Son:public Base { public: virtual void func() { cout test01(); system("pause"); return 0; } 虚析构和纯虚析构

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

解决方式:将父类的析构函数改为虚析构或者纯虚析构

虚析构和纯虚析构公性: *可以解决父类指针释放子类对象 *都需要有具体的函数实现

虚析构和纯虚析构的区别: *如果是纯虚析构,该类属于抽象类,无法实例化对象。

虚析构语法: virtual ~类名(){} 纯虚析构语法: virtual ~类名(){}=0//声明纯虚析构 类名::~类名(){}//纯虚析构函数的调用

代码如下:

#include using namespace std; class Animal { public: Animal() { cout cout cout cout Animal* animal = new Cat("Tom"); animal->Speak(); //通过父类指针去释放,会导致子类对象可能清理干净,造成内存泄露 //怎么解决?给基类增加一个虚析构函数 //虚析构函数就是用来解决通过父类指针释放子类对象 delete animal; } int main() { test01(); system("pause"); return 0; }

总结: 1.虚析构或纯虚析构就是用来解决通过父类指针释放子类对象。 2.如果子类中没有堆区数据,可以不写为虚析构或纯虚析构。 3.拥有纯虚析构函数的类也属于抽象类。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3