首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

虚拟析构函数可能是一件坏事吗?

虚拟析构函数可能会导致一些负面后果。

首先,频繁地调用虚拟析构函数可能会导致性能下降,因为每次调用都会销毁一些对象并释放一些内存。其次,虚拟析构函数可能会导致程序出现未定义的行为,因为它们在对象被销毁时可能会被调用,即使该对象没有被引用。最后,虚拟析构函数可能会导致程序出现不一致的行为,因为它们可能会被调用多次,从而导致对象被销毁多次。

然而,虚拟析构函数也有一些好处,例如它们可以确保对象在被销毁时不会被错误地引用,并且可以确保对象在被销毁之前已经被正确地使用。此外,虚拟析构函数还可以用于实现一些高效的技术,例如垃圾回收和内存池。

因此,是否使用虚拟析构函数取决于具体的情况,需要根据程序的需求和性能要求来做出决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

构造函数函数可以是虚函数,在里面能调用虚函数

构造函数作为虚函数让人觉得是你的构造函数可能是动态的,那我觉得这可能是另一个设计模式,对象固定,构建方法动态来达到多态的目的,后面这段是我自己的看法 函数作为虚函数?...构造函数是不行的,但是函数作为虚函数确实常用的,特别是基类的函数一定要声明为虚函数。首先既然对象存在,那么虚函数表肯定存在,所以函数作为虚函数是合理的。...这时候如果是基类指针指向子类对象,那么删除指针,只会调用基类的函数,因为这时候对象类型是基类对象,函数没有动态绑定,只会调用当前对象类型的。...但是如果将基类函数声明为虚函数,则能成功调用子类的函数 #include using namespace std; class Father { public:...那在构造函数里能调用虚函数 这个问题之前腾讯后端一面出现过,我当时有点蒙 首先编译器是允许你这么做的,但是在构造函数里调用虚函数,可能达不到你想要的效果,我们看看下面的代码 class Father

1.2K50

C++核心准则​讨论:将基类的函数设为公共和虚拟的,或受保护的和非虚拟

函数应该是虚函数?也就是说,是否应该允许通过指向基类的指针进行销毁?如果是,则base的函数必须是公共的才能被调用,否则虚拟调用它会导致未定义的行为。...否则,应该对其进行保护,以便只有派生类才能在自己的函数中调用它,这个函数也应该是非虚的,因为它不需要虚拟地运行。...这种情况导致较早的编码标准对所有基类函数都必须是虚拟的提出了全面的要求。这太过分了(即使是常见情况);相反,规则应该是当且仅当基类函数是公共的时,才将它们虚函数化。...因此,如果可以调用(即是公共的)基类函数,则它是虚拟的,否则是非虚拟的。...注意,NVI模式不能应用于函数,因为构造函数函数无法进行深度虚拟调用。(请参阅第39和55条。)

1.1K20

每日一问06 构造函数可以是虚函数

技术分类:开发语言 前置知识:虚函数工作原理 推荐阅读 :[侯捷]C++内存管理--从平地到万丈高楼 https://www.bilibili.com/video/BV1Kb411B7N8 思路 构造函数可以是虚函数...,为什么 和普通函数对比 首先,C++不支持虚拟构造函数。...根本说不清楚:必须创建好了,才能用,不懂 抽象和具体关系.接口不属于具体一个类 函数可以是虚函数,为什么 参考思路: 可以是 函数 执行顺序是 派生类 ,基类 如果函数不被声明成虚函数,则编译器实施静态绑定...,在删除指向派生类的基类指针时,只会调用基类的函数而不调用派生类函数,这样就会造成派生类对象不完全。...如果声明了,触发 派生类 ,基类 正确顺序。

68730

通俗易懂的解释C++的构造函数

Mage superMage(天使之杖, 神圣裹尸布); 一般来说,你写了自己的构造函数,就有必要写出自己的函数。...~Mage() { //删除法杖、法袍等对象 } } C++保证在你调用delete时,先自动调用函数(而我们安排在这个函数里面删除它的法杖、法袍等对象),再删除对象占用的内存...为了清晰表达“所有权转移、复制”等相关语义,C++标准库才提供了shared_ptr、unique_ptr、weak_ptr等“智能指针”;更有趣的是,这些“智能指针”同样是借助于有保障的构造/函数的自动调用机制设计的...你必须先透彻理解构造/函数,才有可能明白它们的工作原理、甚至自己实现它们(没错,过去那个C++标准化/STL库总是跟不上趟的年代里,很多程序员在自己的工程里手工编写过shared_ptr)。...因此,当其它语言的程序员觉得离开“垃圾回收”都活不成时,资深C++程序员轻蔑的说“资源可不仅仅是内存”——没有严格的RAII机制,没有构造/函数调用时机的可靠保证,其它语言在管理内存之外的资源时,反而要比

36620

【C++】多态

多态的语法及实现 2.1 虚拟函数 要学习多态,首先我们要认识一下虚函数虚拟函数) 虚函数:即被virtual关键字修饰的类成员函数 这里的BuyTicket就是一个虚函数。...,结果我们也能理解,子类对象s先,子类的函数调再完成后自动调用父类的清理父类的部分。...但是在这个地方,我们期望它是这样正常的只调父类的? 是不是不期望啊,因为如果父类的指针指向的是子类对象,在delete的时候还是只调父类的,那是不是就可能会有内存泄漏的风险啊。...但是: 重写不是要求基类和派生类的虚函数名字一样,可是它们两个的函数名字并不一样啊。...只有派生类Student的函数重写了Person的函数,delete对象调用函数,才能构成多态,才能保证p1和p2指向的对象正确的调用函数

9610

C++多态特性

已扣除5元餐费." << endl; return nullptr; } }; 运行结果: 2.1 函数可以是虚函数? 显然,基类与派生类函数的名字不同 ....看起来违背了重写的规则,其实不然,这里可以理解为编译器对函数的名称做了特殊处理,编译后函数的名称统一处理成destructor。...即所有对象的函数,在编译后,都被处理为统一的名字:destructor. 为什么函数名要被统一转化为destructor? 因为要实现多态需要函数名相同....为什么函数要实现多态? 因为函数实现多态了以后,才能实现在基类和派生类时,各自调用自己的函数,防止内存泄漏!...综上,函数可以是虚函数,而且还强烈建议将函数写成虚函数,实现多态. 虚函数重写需要遵守以下条件: 函数名称、参数列表和返回类型在父类和子类中必须完全相同。

12370

【C++干货基地】六大默认成员函数: This指针 | 构造函数 | 函数

没错这就是函数该干的工作了,函数主要负责清理空间和我们以前数据结构中的 destroy 销毁空间的作用是一样的!...4.2 函数的特性 函数是特殊的成员函数,其特征如下: 函数名是在类名前加上字符 ~。 无参数无返回值类型。 一个类只能有一个函数。若未显式定义,系统会自动生成默认的函数。...注意:函数不能重载 对象生命周期结束时,C++编译系统系统自动调用函数。...下面的程序我们会看到,编译器 生成的默认函数,对自定类型成员调用它的函数。...因为函数一般是用来释放我们申请的空间,而内置类型在程序结束会自动释放空间所以没有申请资源可以不写函数

5800

【C++】三大特性之多态

函数的重写(基类与派生类函数的名字不同) 如果基类的函数为虚函数,此时派生类函数只要定义,无论是否加 virtual 关键字, 都与基类的函数构成重写,虽然基类与派生类函数名字不同...虽然函数名不相同, 看起来违背了重写的规则,其实不然,这里可以理解为编译器对函数的名称做了特殊处 理,编译后函数的名称统一处理成  destructor 。...另外,我们实现父类的时候,可以给函数无脑加 virtual 。...但是当我们给父类函数加上 virtual 。的时候就会调用子类的函数了。这是因为不加 virtual 的时候,函数是普通调用,而加上了 virtual 之后就变成了多态调用。...答:不能,因为对象中的虚函数表指针是在构造函数初始化列表 阶段才初始化的。 4. 函数可以是虚函数?什么场景下函数是虚函数

71850

如何设计一个C++的类?

类需要自己写构造函数函数? 反正我每次定义一个类的时候都会明确把构造函数函数写出来,即便它是空实现,即便我不写编译器也会视情况默认生成一个,自动生成的称为默认构造函数。...但我不想依赖编译器,也建议大家不要过度依赖编译器,明确写出来构造函数函数也是一个好习惯,多数情况下类没有那么简单,多数情况下编译器默认生成的构造函数函数不一定是我们想要的。...这个很明确,如果类会作为基类被派生时,该基类的函数就一定要声明为虚函数,如果某个类确定不会被派生,那就不要声明其函数为虚函数。 类需要提供拷贝构造函数?...这里抛砖引玉下,如果是服务端编程,建议使用异常处理替代错误码的错误处理方式,关于异常处理有两个常见问题: 构造函数可以使用异常 函数可以使用异常?...结论是构造函数在处理错误时可以使用异常,而且建议使用异常,函数中也可以使用异常,但不要让异常从函数中逃离,有异常要在函数中捕获处理掉。

1.5K20

【C++】继承

派生类对象初始化时,先调用基类构造再调用子类构造,在时与栈结构相同,先调用子类的函数,在子类函数调用完毕时,编译器会自动调用基类的函数。...所以说,派生类中其他的三个默认成员函数都必须我们自己手动调用基类的对应默认成员函数,但是函数不需要我们自己调用,编译器在子类调用结束后会自动调用基类。 5....额外多说一点的是,如果我们自己调用父类函数的话,则必须指明父类域,因为编译器会把函数名特殊处理成destructor(),所以如果不指定类域就会出现派生类的函数内部调用自己的函数,则编译器会报错...(由于多态的关系需求,所有的函数都会特殊处理成destructor函数名) //2.调用了一次Person的构造,两次,其实是因为我们显示调用了Person的,编译器自己会自动调用...可得结论:子类函数不需要显示调用父类,依靠编译器之后的自动调用即可。

66610

【C++ 初阶路】--- 类和对象(下)

函数: 与构造函数功能相反,函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用函数,完成对象中资源的清理工作。...1.2 特性 函数是特殊的成员函数,其特征如下: 函数名是在类名前加上字符 ~(eg: ~Date())。 无参数无返回值类型。 一个类只能有一个函数。...若未显式定义,系统会自动生成默认的函数。注意:函数不能重载; 对象生命周期结束时,C++编译系统系统自动调用函数。...默认成员函数函数的初步理解可以通过此题:232. 用栈实现队列。我们定义一个队列其中包含了两个栈,结合上面的理解,那么队列无需写函数,栈需要显示写函数来释放动态开辟的空间。...既然编译器生成的默认赋值运算符重载函数已经可以完成字节序的值拷贝了,还需要自己实现

6810

《逆袭进大厂》第二弹之C++进阶篇59问59答(超硬核干货)

每一个类必须有一个函数,用户可以自定义函数,也可以是编译器自动生成默认的函数。一般函数定义为类的公有成员。...77、构造函数函数可以调用虚函数,为什么 1) 在C++中,提倡不在构造函数函数中调用虚函数; 2) 构造函数函数调用虚函数时都不使用动态联编,如果在构造函数函数中调用虚函数,...2) 函数顺序 ① 调用派生类的函数; ② 调用成员类对象的函数; ③ 调用基类的函数。 79、虚函数的作用,父类的函数是否要设置为虚函数?...如果函数执行不全,就是没有完成他应该执行的每一件事情。 81、构造函数一般不定义为虚函数的原因 (1)创建一个对象时需要确定对象的类型,而虚函数是在运行时动态确定其类型的。...83、构造函数或者函数中可以调用虚函数 简要结论: 从语法上讲,调用完全没有问题。 但是从效果上看,往往不能达到需要的目的。

2.3K40

C++ 初阶 类和对象(中)

在C语言的学习中,我们创建一个结构体变量之后所做的第一件事就是初始化结构体变量,我们往往会为此写上一个初始化函数,Init+被初始化的结构体名字。...有细心的同学可以发现,a也被初始化了,它不应该是随机值?...二、函数 1.为什么要有函数?...因此在C++中,就诞生了一个函数,它就是函数,它能够令对应的类出了它的生命域便销毁,从而保证了安全性。 2.函数的特性 1. 函数名是在类名前加上字符 ~。 2....一若未显式定义,系统会自动生成默认的函数。注意:函数不能重载 4. 对象生命周期结束时,C++编译系统系统自动调用函数

13110

函数

实际上,优秀的程序员常常把基类的函数定义为虚函数。因为,将基类的函数定义为虚函数后,当利用delete删除一个指向派生类定义的对象指针时,系统会调用相应的类的函数。...而不将函数定义为虚函数时,只调用基类的函数。   (2)只需要在声明函数的类体中使用关键字“virtual”将函数声明为虚函数,而定义函数时不需要使用关键字“virtual”。   ...构造函数只能调用“局部”版本,是因为调用时还没有派生类版本的信息。函数则是因为派生类版本的信息已经不可靠了。我们知道,函数的调用顺序与构造函数相反,是从派生类的函数到基类的函数。...当某个类的函数被调用时,其派生类的函数已经被调用了,相应的数据也已被丢失,如果再调用虚函数的派生类的版本,就相当于对一些不可靠的数据进行操作,这是非常危险的。...通过上面的讲述,相信我们对虚函数表有一个比较细致的了解了。水可载舟,亦可覆舟。下面,让我们来看看我们可以用虚函数表来干点什么坏事吧。

76031

面试官终极拷打-腾讯篇

2.项目的服务器如果要设计成分布式,怎么设计(可能是想问多个服务器负载均衡和高可用)? 3.c++11新特性有哪些? 4.智能指针有哪些,智能指针是线程安全的? 5.多线程怎么保证安全?...(我说了锁)除了锁还有其他方法? 6.单例模式怎么写,双检查锁的单例怎么写? 7.继承和多态的实现 8.动态库和静态库区别 9.怎么导出类,可以导出类? 10.怎么导出接口和函数?...2.构造函数函数能否调用函数?...4.TCP流量控制是怎么做的,不要ssthred这个值可以做到? 4.进程和线程的区别 5.进程占用了哪些资源,进程的内存是怎么使用的(说说堆,栈,虚拟内存的东西)?...秋招ieg部门二面 这里都是很基础的八股文和个人问题 1.mysql的myisam和innodb的区别,mysql的锁,索引,事务级别,默认事务级别,MVVC版本控制链 2.虚拟内存的机制,分页分段,进程和线程

77310

三大特性之多态

函数函数名要求必须要与类名相同,也就是说各个类的函数名都不同,但是其实编译器会将函数函数名统一处理成destructor。...函数不但能重写,并且函数建议定义成虚函数。...如果我将函数定义为虚函数并重写,那么我在释放父类指针的时候,调用的是子类的函数,子类函数对于父类那一部分资源通过父类的函数清理,同时也会清理自己的资源。...什么是多态 答:多态就是多种形态,不同的对象来做同一件事产生不同效果的行为就可以称为多态。...inline函数可以是虚函数? 答:可以,不过编译器就忽略inline属性,这个函数就不再是inline,因为虚函数要放到虚表中去。 静态成员可以是虚函数? ​

16420

复杂的C++继承

父类和子类的函数也会构成隐藏,因为底层将函数统一处理成了destructor函数 父类和子类中不要定义同名的成员,因为这本身也容易让人混淆 子类中的默认成员函数 继承的子类与普通类不同的地方在于...构造函数函数:对于内置类型不做处理,对于自定义类型调用它的构造和 拷贝构造和赋值重载:对于内置类型按字节拷贝,对于自定义类型调用它的拷贝构造和赋值重载 子类中父类的那一部分,要调用父类的默认成员函数来处理..._b; } return *this; } private: int _b; }; 但是函数是一个例外,我们不能显示的调用父类的函数: class Parent { public...父类的不用我们调用,在子类的结束时编译器会自动调用父类的,这里我们可以通过汇编来看一下: 需要自己写默认成员函数的情况 1.父类没有默认构造函数,需要自己显示写构造 2.子类存在浅拷贝,需要自己写赋值重载和拷贝构造...多继承本身没有错,因为一个类继承多个类也是一件很合理的事情。

24730

函数的用法【简单理论讲解】

函数是“反向”的构造函数。它们在对象被撤消(回收)时调用。函数的名 称除了最前面的“~”符号外,与类的名称相同。例如,类String的函数是~string()。...函数通常用于当一个对象不再需要时,完成“消除”功能。     在函数中建立对象之后,这个对象作为局部对象开始生存,直到函数运行到遇见右括号“}”才结束生存,此时调用函数。     ...·使用完全限定名显示调用对象的函数。      有几条规则约束着函数的说明:      ·不能接受参量。      ·  不能说明有任何返回类型(包括void)。     ...· 不能说明为const、volatile或static,但函数可以因说明为const、volatile或static的对象的而被调用。      ·可以说明为虚拟的。...使用虚函数,可以撤消对象而不必知道该对象的类型。由于使用虚拟函数机制,程序将调用该对象的正确的函数

784110

C++:深入理解多态

(基类与派生类函数的名字不同) 如果基类的函数为虚函数,此时派生类函数只要定义,无论是否加virtual关键字,都与基类的函数构成重写,虽然基类与派生类函数名字不同。...虽然函数名不相同,看起来违背了重写的规则,其实不然,这里可以理解为编译器对函数的名称做了特殊处理,编译后函数的名称统一处理成destructor。...Person的函数,下面的delete对象调用函 //数,才能构成多态,才能保证p1和p2指向的对象正确的调用函数。...函数可以是虚函数?什么场景下函数是虚函数? 答:可以,并且最好把基类的函数定义成虚函数。因为函数都会被编译器处理为destruct,如果没有多态会使得父类的函数被隐藏。...而有多态的话子类可以重写父类的函数,这样子类就调子类的,父类调父类的,互相不会冲突更不会造成内存泄露。 9. 对象访问普通函数快还是虚函数更快?

6400

C++虚调用及其调用的具体形式

2.虚函数的几种实调用的情形 2.1不通过指针或者引用调用虚函数 虚调用不能简单的理解成“对虚函数的调用”,因为对虚函数的调用很有可能是实调用。考察如下程序。...在函数体内,a是一个“纯粹”的类A的对象,与类型B毫无关系,所以a.show()是实调用。 2.2构造函数函数中调用虚函数 在构造函数函数中调用虚函数,对虚函数的调用实际航是实调用。...时,在销毁一个对象时,先调用该类所属类的函数,然后再调用其基类的函数。所以,在调用基类的函数时,派生类已经被了,派生类数据成员已经失效,无法动态的调用派生类的虚函数。...也是如此,对虚函数的调用是实调用。因此,一般情况下,应该避免在构造函数函数中调用虚函数,如果一定要这样做,程序猿必须清楚,这时对虚函数的调用其实是实调用。...4.虚调用一定要借助于指针或引用来实现 答案是否定的。在实际应用中,绝大多数的虚调用的确是显示借助于指针或者引用来实现,但是可以通过间接的方式来实现虚调用。

47230
领券