专业汉语词典知识平台,分享汉字词语知识、历史文学知识解答!

励北网
励北网

虚函数的作用,虚函数的实现原理

来源:小易整编  作者:小易  发布时间:2023-02-22 05:56
摘要:虚函数的作用,虚函数的实现原理本期是C++基础语法分享的第七节,今天给大家来分享一下:(1)虚析构函数;(2)纯虚函数;(3)虚函数、纯虚函数;(4)虚函数指针、虚函数表;(5)虚继承;(6)虚继承、虚函数;(7)模板类、成员模板、虚函数;...

虚函数的作用,虚函数的实现原理

本期是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++哟~


本文地址:百科问答频道 https://www.neebe.cn/wenda/903262.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


百科问答
小编:小易整编
相关文章相关阅读
  • Excel中countif函数的使用方法

    Excel中countif函数的使用方法

    Excel中有很多函数,很多都可以为我们大大减少计算的时间,一步就得出结果,很多朋友在使用countif函数时,会出现一些错误导致不成功,我们这就来给你详细讲讲countif函数是应该如何使用的。countif函数的含义...

  • SUBTOTAL函数怎么用?

    SUBTOTAL函数怎么用?

    操作方法01隐藏行汇总方法:在目标单元格输入公式:=SUBTOTAL(109,C3:C9)。02筛选汇总。方法:在目标单元格输入公式:=SUBTOTAL...

  • 函数库是什么意思?

    函数库是什么意思?

    函数库是指由一组编写好的、结构化的可执行函数组成的库文件,其中的函数可以增加程序的通用功能以提升程序的运行效率,节省开发时间并提高软件的质量。函数库更常用于缩短编程时间、提供程序实现通用功能以及用于程序编写中特定功能的实现。函数库有帮助程...

  • 用数学画图软件——Graph绘制函数图形

    用数学画图软件——Graph绘制函数图形

    Graph是一款开源类的绘制函数图像软件。它不仅能根据函数绘制其图像,还能够绘制曲线上的切线、法线和阴影等。除了绘制功能,它还具有计算功能,其中包括曲线长度、面积等的计算。下面我来给大家介绍一下如何使用Graph绘制函数图像。操作方法...

  • Excel SLOPE函数的使用方法

    Excel SLOPE函数的使用方法

    在数学中SLOPE是斜率的意思,Excel中的SLOPE函数也是一个计算斜率的函数。请诸位和我一起学习——SLOPE函数。操作方法01SLOPE函数的功能把已知的自变量和因变量作为数据点,计算线性回...

  • Excel之MODE函数使用方法

    Excel之MODE函数使用方法

    MODE返回的数组或数据区域中出现频率最高或重复出现次数最多的值。此函数已被替换MODE.MULT函数和MODE.SNGL函数。操作方法01打开Excel,将测试使用的数据复制到表格中,如下图。...

  • 关系型数据库的基本原理是什么

    关系型数据库的基本原理是什么

    关系型数据库采用的是关系模型,即把数据组织成一个或多个表格(称为关系),每个表格包含多个列,每行代表一个记录。这种模型的优点是简单易懂,容易维护,便于数据查询和修改。其次是数据结构,关系型数据库采用的是二维表格结构,每个表格有一个主键用于唯...

  • 摄像头成像的光学原理

    摄像头成像的光学原理

    摄像是一种利用光学成像原理形成影像并使用底片记录影像的设备,是用于被摄景物反射出的光线通过照相镜头,经常应用在高档次数码摄像机,我们就能看见东西了摄像头成像的原理和这个过程非常相似。摄像是一种利用光学成像原理形成影像并使用底片记录影像的设备...

  • 周排行
  • 月排行
  • 年排行

精彩推荐