简述虚函数的使用方法_一文详解虚函数及其相关知识点
这一期是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 日本季刊
推荐阅读
- alfa romeo车标含义?(阿尔法罗密欧车标)
- 华为鸿蒙os如何操作 华为鸿蒙os2.0系统官网报名入口
- 14款沃尔沃s60l二手车能买吗?(沃尔沃s60为什么贬值厉害)
- power mp3 wma converter(mp3格式转换器)软件介绍(power mp3 wma converter(mp3格式转换器))
- 42岁李贞贤宣布平安生女,网友:歌声击退山贼的那个
- 热火朝天的高铁WiFi迟迟未到(5G能否破局)
- 华为手机性价比最高是哪几款2022? 华为哪款手机性价比高最值得入手
- 进口捷豹全部车型报价?(捷豹报价大全价格表)
- 韩庚江铠同疑相恋,两人同游马尔代夫遭曝光
- 八卦格字帖软件介绍(八卦格字帖)
- 虚拟机 操作系统(操作系统整合:虚拟机管理程序的下一步)
- 比亚迪f6参数配置?(比亚迪f6)
- 奥沙利文获世锦冠军,奥沙利文得了几次世锦赛冠军
- Evel Knievel手游游戏介绍(Evel Knievel手游)
- 索尼wi1000x拆解(SONYNZW-X1000系列高清拆解图集)
- 4座硬顶敞篷跑车都有哪几款?(4门4座硬顶敞篷车推荐)
- 艺术体操团体全能决赛,艺术体操团体全能决赛中国
- 工人物语6通用修改器游戏介绍(工人物语6通用修改器)
- 简述电机换向器的工作原理图(简述电机换向器的工作原理)
- Atheros-AR5007EG无线网卡驱动软件介绍(Atheros-AR5007EG无线网卡驱动)