首页 / 行业
一文详解虚函数及其相关知识点
2021-10-13 10:14:00
本期是C++基础语法分享的第七节,今天给大家来分享一下:
(1)虚析构函数;
(2)纯虚函数;
(3)虚函数、纯虚函数;
(4)虚函数指针、虚函数表;
(5)虚继承;
(6)虚继承、虚函数;
(7)模板类、成员模板、虚函数;
(8)抽象类、接口类、聚合类;
虚析构函数
虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象。
虚析构函数使用
class Shape{public: Shape(); // 构造函数不能是虚函数 virtual double calcArea(); virtual ~Shape(); // 虚析构函数};class Circle : public Shape // 圆形类{public: virtual double calcArea(); 。。。};int main(){ Shape * shape1 = new Circle(4.0); shape1-》calcArea(); delete shape1; // 因为Shape有虚析构函数,所以delete释放内存时,先调用子类析构函数,再调用基类析构函数,防止内存泄漏。 shape1 = NULL; return 0;}
纯虚函数
纯虚函数是一种特殊的虚函数,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。
virtual int A() = 0;
虚函数、纯虚函数
类里如果声明了虚函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖(override),这样的话,编译器就可以使用后期绑定来达到多态了。纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。
虚函数在子类里面可以不重写;但纯虚函数必须在子类实现才可以实例化子类。
虚函数的类用于 “实作继承”,继承接口的同时也继承了父类的实现。纯虚函数关注的是接口的统一性,实现由子类完成。
带纯虚函数的类叫抽象类,这种类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。抽象类被继承后,子类可以继续是抽象类,也可以是普通类。
虚基类是虚继承中的基类,暂不做详细说明。
虚函数指针、虚函数表
虚函数指针:在含有虚函数类的对象中,指向虚函数表,在运行时确定。
虚函数表:在程序只读数据段,存放虚函数指针,如果派生类实现了基类的某个虚函数,则在虚表中覆盖原本基类的那个虚函数指针,在编译时根据类的声明创建。
虚继承
虚继承用于解决多继承条件下的菱形继承问题(浪费存储空间、存在二义性)。
底层实现原理与编译器相关,一般通过虚基类指针和虚基类表实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(需要强调的是,虚基类依旧会在子类里面存在拷贝,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承的子类被当做父类继承时,虚基类指针也会被继承。
实际上,vbptr 指的是虚基类表指针(virtual base table pointer),该指针指向了一个虚基类表(virtual table),虚表中记录了虚基类与本类的偏移地址;通过偏移地址,这样就找到了虚基类成员,而虚继承也不用像普通多继承那样维持着公共基类(虚基类)的两份同样的拷贝,节省了存储空间。
虚继承、虚函数
相同之处:都利用了虚指针(均占用类的存储空间)和虚表(均不占用类的存储空间)
不同之处:
虚继承
(1)虚基类依旧存在继承类中,只占用存储空间
(2)虚基类表存储的是虚基类相对直接继承类的偏移
虚函数
(1)虚函数不占用存储空间
(2)虚函数表存储的是虚函数地址
模板类、成员模板、虚函数
模板类中可以使用虚函数
一个类(无论是普通类还是类模板)的成员模板(本身是模板的成员函数)不能是虚函数
抽象类、接口类、聚合类
抽象类:含有纯虚函数的类
接口类:仅含有纯虚函数的抽象类
聚合类:用户可以直接访问其成员,并且具有特殊的初始化语法形式。满足如下特点:
(1)所有成员都是 public
(2)没有定义任何构造函数
(3)没有类内初始化
(4)没有基类,也没有 virtual 函数
今天的分享就到这里了,大家要好好学C++哟~
最新内容
手机 |
相关内容
基于单片金纳米线逻辑电路的多功能
基于单片金纳米线逻辑电路的多功能智能可穿戴设备开发,智能,可穿戴设备,逻辑电路,健康,分享,监测,随着科技的不断发展,可穿戴设备已分享一种隔离器互调测试方法
分享一种隔离器互调测试方法,测试方法,分享,测量,信号,频谱,测试,隔离器互调测试是一种评估隔离器性能的重要方法。BC857BW隔离器的分享国产ADC芯片的技术问题集合
分享国产ADC芯片的技术问题集合,问题集合,芯片,分享,多通道,信号,精度,1、什么是ADC芯片?ADC芯片(Analog-to-Digital Converter)是一种干货分享|高功率氮化镓场效应晶体
干货分享|高功率氮化镓场效应晶体管:高性能、高效率、高可靠性,高效率,分享,效应,损耗,道中,控制,高功率氮化镓场效应晶体管(GaN FET)单相电动机控制电路图分享
单相电动机控制电路图分享,电路图,电动机控制电路图,单相电动机控制电路图分享 控制电路,电路图,电动机,单相电动机,电抗器,单相电电动机控制电路图分享
电动机控制电路图分享,电路图,电动机控制电路图,电动机控制电路图分享 plc,编程,控制电路,电机,正反转电路,1、启动、保持和停止电分享一个厨房定时器电路
分享一个厨房定时器电路,电路图,定时器电路图,分享一个厨房定时器电路 定时器,定时器电路, 厨房计时器是我们在厨房中使用的小工温度报警电路分享
温度报警电路分享,电路图,报警电路图|报警器电路图,温度报警电路分享 温度报警,如图所示的温度报警电路,能实现温度报警功能。已知比