在C++中,能否声明虚构函数-为什么-能否声明虚析构函数-为什么

网上有关“在C++中,能否声明虚构函数?为什么?能否声明虚析构函数?为什么”话题很是火热,小编也是针对在C++中,能否声明虚构函数?为什么?能否声明虚析构函数?为什么寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。

原因如下:在C++-中不能声明虚构造函数,多态是不同的对象对同一消息有不同的行为特性,虚函数作为运行过程中多态的基础,主要是针对对象的,面构造函数是在对盘产生之前运行的,因此虚构造函数是没有童义的。

在C++中可以声明虚析构函数,析构函数的功能是在该类对象消亡之前进行一些必要的清理工作,如果一个类的析构函数是虚函数,那么由它派生而来的所有子类的析构函数也是虚函数。

析构函数设置为虚函数之后,在使用指针引用时可以动态联编,实理运行时的多态,保证使用基类的指针就能够谓用适当的析构函数指针对不同的对象进行清理工作。

扩展资料:

虚函数的限制:

1、非类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。实际上,优秀的程序员常常把基类的析构函数定义为虚函数。

因为将基类的析构函数定义为虚函数后,当利用delete删除一个指向派生类定义的对象指针时,系统会调用相应的类的析构函数。而不将析构函数定义为虚函数时,只调用基类的析构函数。

2、只需要在声明函数的类体中使用关键字“virtual”将函数声明为虚函数,而定义函数时不需要使用关键字“virtual”。

3、当将基类中的某一成员函数声明为虚函数后,派生类中的同名函数(函数名相同、参数列表完全一致、返回值类型相关)自动成为虚函数。

4、如果声明了某个成员函数为虚函数,则在该类中不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。在以该类为基类的派生类中,也不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。

百度百科-虚函数

1、为什么构造函数不可以是虚函数

①从存储空间角度

虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。

②从使用角度

虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。

虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。

③构造函数不需要是虚函数,也不允许是虚函数,因为创建一个对象时我们总是要明确指定对象的类型,尽管我们可能通过实验室的基类的指针或引用去访问它。但析构却不一定,我们往往通过基类的指针来销毁对象。这时候如果析构函数不是虚函数,就不能正确识别对象类型从而不能正确调用析构函数。

④从实现上看,vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数

从实际含义上看,在调用构造函数时还不能确定对象的真实类型(因为子类会调父类的构造函数);而且构造函数的作用是提供初始化,在对象生命期只执行一次,不是对象的动态行为,也没有太大的必要成为虚函数

⑤当一个构造函数被调用时,它做的首要的事情之一是初始化它的V P T R。因此,它只能知道它是“当前”类的,而完全忽视这个对象后面是否还有继承者。当编译器为这个构造函数产生代码时,它是为这个类的构造函数产生代码- -既不是为基类,也不是为它的派生类(因为类不知道谁继承它)。

所以它使用的V P T R必须是对于这个类的V TA B L E。而且,只要它是最后的构造函数调用,那么在这个对象的生命期内, V P T R将保持被初始化为指向这个V TA B L E, 但如果接着还有一个更晚派生的构造函数被调用,这个构造函数又将设置V P T R指向它的 V TA B L E,等.直到最后的构造函数结束。V P T R的状态是由被最后调用的构造函数确定的。这就是为什么构造函数调用是从基类到更加派生 类顺序的另一个理由。

但是,当这一系列构造函数调用正发生时,每个构造函数都已经设置V P T R指向它自己的 V TA B L E。如果函数调用使用虚机制,它将只产生通过它自己的V TA B L E的调用,而不是最后的V TA B L E(所有构造函数被调用后才会有最后的V TA B L E)。

2、为什么析构函数可以是虚函数

编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。

所以建议的方式是将析构函数声明为虚函数。如果你使用MFC,并且以CObject或其派生类为基类,那么MFC已经为你做了这件事情;CObject的析构函数是虚函数。一个函数一旦声明为虚函数,那么不管你是否加上virtual 修饰符,它在所有派生类中都成为虚函数。但是由于理解明确起见,建议的方式还是加上virtual 修饰符。

C++不把虚析构函数直接作为默认值的原因是虚函数表的开销以及和C语言的类型的兼容性。有虚函数的对象总是在开始的位置包含一个隐含的虚函数表指针成员。如果是对于MFC类CPoint和CSize这样的小型类,增加一个指针就增加了很多内存占用,而且使得其内存表示和基类POINT和SIZE不一致。

关于“在C++中,能否声明虚构函数?为什么?能否声明虚析构函数?为什么”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!

本文来自作者[瑞雨少爷]投稿,不代表唯乐迪立场,如若转载,请注明出处:https://www.cqwld.cn/weile/993.html

(12)

文章推荐

  • 旱金莲怎么养殖旱金莲的繁殖方法-

    网上有关“旱金莲怎么养殖旱金莲的繁殖方法?”话题很是火热,小编也是针对旱金莲怎么养殖旱金莲的繁殖方法?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。旱金莲是旱金莲科、旱金莲属稀有野生植物,为1年生或多年生的攀缘性植物。养殖旱金莲需要注意什么呢?以下是由我整理

    2025年10月24日
    19306
  • 义乌到福州最佳乘车方案

    网上有关“义乌到福州最佳乘车方案”话题很是火热,小编也是针对义乌到福州最佳乘车方案寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。K164(福州——上海南)16点02分福州开,凌晨3点58分到义乌,用时11小时56分钟票价为硬座94元、硬卧上164元、硬卧中1

    2025年10月24日
    18315
  • 延安和西安的海拔高度各是多少

    网上有关“延安和西安的海拔高度各是多少”话题很是火热,小编也是针对延安和西安的海拔高度各是多少寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。延安的海拔高度是:1070米西安的海拔高度是:385米延安,简称“延”,古称肤施、高奴、延州,原陕甘宁边区政府首府。国

    2025年10月24日
    17317
  • 奇瑞e5保养手册(奇瑞e5消除保养警示)

    网上有关“奇瑞e5保养手册(奇瑞e5消除保养警示)”话题很是火热,小编也是针对奇瑞e5保养手册(奇瑞e5消除保养警示)寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。奇瑞e5维护注意事项:1.淋雨后及时洗车、洗车。遇到大雨时,返程后应及时清洗,否则可能会造成车

    2025年10月25日
    13307
  • 中央政府对在岗代课教师的政策能否转正

    网上有关“中央政府对在岗代课教师的政策能否转正”话题很是火热,小编也是针对中央政府对在岗代课教师的政策能否转正寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。可以的。代课教师超过8年,需要按照相关劳动法规进行转正了,需要签订劳动合同的,才有法律依据。在岗代课教

    2025年10月26日
    11307
  • 单反相机逆光摄影技巧

    网上有关“单反相机逆光摄影技巧”话题很是火热,小编也是针对单反相机逆光摄影技巧寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。 摄影家们常有这样一句话:“开始我们不过迷上了单反相机这一个尤物,而结果却爱上了摄影这一门艺术。”下面是我整理的单反相机逆光摄影技巧,

    2025年10月26日
    8317
  • 哪个台播出的《极限挑战》中黄磊为什么被称为老狐狸?

    网上有关“哪个台播出的《极限挑战》中黄磊为什么被称为老狐狸?”话题很是火热,小编也是针对哪个台播出的《极限挑战》中黄磊为什么被称为老狐狸?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。东方卫视播出的《极限挑战》因为黄磊真的很聪明,人特别的好,厨艺也很棒而且特

    2025年10月26日
    9318
  • 大学英语竞赛的奖项是怎么评的?

    网上有关“大学英语竞赛的奖项是怎么评的?”话题很是火热,小编也是针对大学英语竞赛的奖项是怎么评的?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。1、获得证书,宣传和认可,并参加活动。2、奖项级别:本竞赛的四个类别中有四个国家奖项级别,特别奖,一等奖,二等奖

    2025年10月26日
    8322
  • 桐柏县城到随州殷店路线

    网上有关“桐柏县城到随州殷店路线”话题很是火热,小编也是针对桐柏县城到随州殷店路线寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。驾车路线:全程约98.7公里起点:桐柏县1.南阳市内驾车方案1)从起点向正西方向出发,行驶90米,左前方转弯2)行驶210米,

    2025年10月26日
    8322
  • 耐高温隔热保温涂料应用及配方解析

    网上有关“耐高温隔热保温涂料应用及配方解析”话题很是火热,小编也是针对耐高温隔热保温涂料应用及配方解析寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。涂料除了是我们常见到的外,其实它还有一些工_呢,比如耐高温、隔热、保温等等都是涂料的功能。也是因为涂料有这些功

    2025年10月27日
    6303
  • 梦见自己相片上了保家仙堂口

    网上有关“梦见自己相片上了保家仙堂口”话题很是火热,小编也是针对梦见自己相片上了保家仙堂口寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。1、梦见自己相片上了保家仙堂口的吉凶指数有父祖余德所荫益,或由长

    2025年10月27日
    5307
  • 如何调整比赛时的心理紧张情绪

    网上有关“如何调整比赛时的心理紧张情绪”话题很是火热,小编也是针对如何调整比赛时的心理紧张情绪寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。现代体育比赛不仅仅是技术与战术的较量,心理状态也起了重要作用。战术的灵活运用是心理状态稳定的体现。心理紧张是神经系统兴

    2025年10月27日
    3309

发表回复

本站作者才能评论

评论列表(3条)

  • 瑞雨少爷的头像
    瑞雨少爷 2025年10月26日

    我是唯乐迪的签约作者“瑞雨少爷”

  • 瑞雨少爷
    瑞雨少爷 2025年10月26日

    本文概览:网上有关“在C++中,能否声明虚构函数?为什么?能否声明虚析构函数?为什么”话题很是火热,小编也是针对在C++中,能否声明虚构函数?为什么?能否声明虚析构函数?为什么寻找了一些...

  • 瑞雨少爷
    用户102607 2025年10月26日

    文章不错《在C++中,能否声明虚构函数-为什么-能否声明虚析构函数-为什么》内容很有帮助