简述虚函数的使用方法_一文详解虚函数及其相关知识点
这一期是C基础语法分享的第七节,今天就和大家分享一下:
(1)虚拟析构函数;
(2)纯虚函数;
(3)虚函数和纯虚函数;
(4)虚函数指针和虚函数表;
(5)虚拟继承;
(6)虚拟继承和虚拟功能;
(7)模板类、成员模板和虚函数;
(8)抽象类、接口类、聚合类;
虚拟析构函数
虚析构函数就是解决基类的指针指向派生类对象的问题,用基类的指针删除派生类对象。
虚拟析构函数的使用
类Shape { public:Shape();//构造函数不能是虚函数virtual double calcArea();虚拟~ Shape();//虚拟析构函数};class circle:public shape//circular class { public:virtual double calcarea();};int main(){ Shape * Shape 1=new Circle(4.0);shape 1-》calcArea();删除shape1//因为Shape有一个虚析构函数,所以delete释放内存时,先调用子类析构函数,再调用基类析构函数,防止内存泄漏。shape1=NULL返回0;}
纯虚函数
纯虚函数是一种特殊的虚函数。在基类中,虚函数不能被赋予有意义的实现,但它被声明为纯虚函数,其实现留给基类的派生类。
虚拟int A()=0;
虚函数,纯虚函数
如果在一个类中声明了一个虚函数,那么即使它是空的,也会被实现。它的作用是使函数在其子类中被覆盖,这样编译器就可以使用后期绑定来实现多态性。纯虚函数只是一个接口,一个函数的声明,应该留给子类来实现。
虚函数不能在子类中重写;但是纯虚函数必须在子类中实现,子类才能实例化。
虚函数的类用于“实现继承”,继承父类的接口和实现。纯虚函数注重接口的统一性,实现由子类完成。
具有纯虚函数的类称为抽象类,抽象类不能直接生成对象,只有被继承并重写其虚函数后才能使用。抽象类被继承后,子类可以继续是抽象类或者普通类。
虚拟基类是虚拟继承中的基类,暂时不详细解释。
虚函数指针、虚函数表
虚函数指针:在包含虚函数类的对象中,指向虚函数表,在运行时确定。
虚函数表:在程序的只读数据段,存储虚函数指针。如果派生类实现了基类的虚函数,那么在根据编译时类的声明创建的虚拟表中,原始基类的虚函数指针将被覆盖。
虚拟继承
虚拟继承用于解决多重继承(浪费存储空间,有歧义)情况下的钻石继承问题。
底层实现原理与编译器有关,一般通过虚拟基类指针和虚拟基类表来实现。每个虚拟继承的子类都有一个虚拟基类指针(占用一个指针的存储空间,4个字节)和一个虚拟基类表(不占用类对象的存储空间)(需要强调的是,虚拟基类在子类中还是会被复制,但最多只有一个副本,不会出子类);当虚拟继承的子类作为父类被继承时,虚拟基类指针也被继承。
其实vbptr指的是一个虚拟基表指针,指向一个虚拟基表,里面记录了虚拟基类和这个类的偏移地址;通过移位地址找到虚拟基类成员,虚拟继承不需要像普通多继承一样维护两个相同的公共基类(虚拟基类)副本,节省存储空间。
虚拟继承、虚拟函数
相似之处:两者都使用虚拟指针(占用类的存储空间)和虚拟表(不占用类的存储空间)。
差异:
虚拟继承
(1)虚拟基类仍然存在于继承的类中,只占用存储空间。
(2)虚拟基类表存储虚拟基类从directl的偏移
(2)虚函数表存储虚函数地址。
模板类、成员模板、虚函数
模板类中可以使用虚函数。
一个类(不管是普通类还是类模板)的成员模板(本身就是模板的成员函数)不能是虚函数。
抽象类、接口类、聚合类
抽象类:包含纯虚函数的类
接口类:只包含纯虚函数的抽象类。
聚合类:用户可以直接访问它的成员,并有一个特殊的初始化语法。满足以下特征:
(1)所有成员都是公开的。
(2)没有定义构造函数。
(3)没有课内初始化
(4)没有基类,没有虚函数。
今天的分享到此结束。大家都要学C哟~
japan quarterly 日本季刊
推荐阅读
- 传感器与变送器的区别与联系是什么_传感器与变送器有什么区别和联系
- win10如何下载并安装eclipse,java开发套件
- 电脑开机显示屏没反应是什么原因 电脑开机显示器没反应
- 地沟油的主要成分,如何分辨地沟油
- 微信聊天记录怎么备份和恢复到电脑,微信聊天记录怎么备份和恢复
- 成都租车去拉萨旅游多少钱_成都租车去拉萨
- 拆解5个案例(为你总结出3条民营医疗的品牌营销心法_干货:民营医院营销的10个手段)
- 腾达信号扩展器怎么重新设置,腾达a9无线信号扩展器怎么设置
- 如何在线一键转换“CEB,文件为PDF文件”
- 惠普m435出现一直打印测试页 惠普官网网站
- 电水壶不亮灯怎么修,家用电水壶指示灯不亮不加热故障的维修经验
- 华为手机如何取消锁屏图片,华为手机如何取消锁屏
- 2022年教资高中生物答案出来了吗 2022年上半年教资考试答案
- 2021款现代ix35改装_现代ix35改装
- 英雄传说碧之轨迹手机版游戏介绍(英雄传说碧之轨迹手机版)
- qq账号解封步骤,qq账号怎么解封
- vulkan模式是什么 一文解读Vulkan图形系统究竟是什么?
- 养荷兰猪注意事项,养荷兰猪需要注意什么
- 2021监理工程师考试真题答案(2021年监理工程师考试真题解析)