析构函数可以是虚函数(析构函数是否必须为虚函数为何)

本文目录
- 析构函数是否必须为虚函数为何
- 析构函数为什么是虚函数
- c++什么是虚函数,构造与析构函数可以是虚函数吗
- 关于虚函数的说法不正确的是()
- C++中能不能将析构函数定义为纯虚函数
- 构造、析构函数可否为virtual
- C++构造,析构函数可以是虚函数吗,是否可以被继承
- c++析构函数、构造虚定义为虚函数的问题
- c++什么是虚函数,构造与析构函数可以是虚函数吗_百度知道
- c++中 析构函数中可以调用虚函数么
析构函数是否必须为虚函数为何
析构函数可以为虚函数,也可以不为虚函数。(更多的时候不为虚函数)
设计析构函数为虚函数,主要是考虑到继承。
当A为基类,B为A的继承类,考虑如下情况:
A
*p
=
new
B();
.....
delete
p;
如果此时A的析构函数不是虚函数,那么在delete
p的时候就会调用A的析构函数,而不会调用B的析构函数,这样就会造成B的资源没有释放。
而如果A的析构函数为虚函数,那么就会调用B的析构函数,一切正常。
析构函数为什么是虚函数
析构函数可以为虚函数,也可以不为虚函数。(更多的时候不为虚函数)。设计析构函数为虚函数,主要是考虑到继承。
析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。
函数介绍
与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统会自动执行析构函数。以C++语言为例:析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。
c++什么是虚函数,构造与析构函数可以是虚函数吗
虚函数是用是实现多态。也可以为将来升级程序带来好处
析构函数可以是虚的构造函数不行
关于虚函数的说法不正确的是()
关于虚函数的说法不正确的是()
A.基类中的虚函数可为派生类继承,继承下来仍是虚函数
B.虚函数重新定义时必须保证其返回值和参数个数及类型与基类中的项一致
C.虚函数必须是类的一个成员函数
D.析构函数和构造函数都可以是虚函数,都可以被继承
正确答案:D
C++中能不能将析构函数定义为纯虚函数
纯虚函数:当一个类被定义后,有一些函数往往还不能确定,这个时候为了访止乱写一个制成错误,就要用纯虚函数。没有函数体的函数。
所以虚构函数和是不是析构函数没有冲突的。是可以用的
构造、析构函数可否为virtual
构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用虚函数。构造函数不能声明为虚函数的原因是:解释一:所谓虚函数就是多态情况下只执行一个。而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象。如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造。还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错。解释二:虚函数的主要意义在于被派生类继承从而产生多态。派生类的构造函数中,编译器会加入构造基类的代码,如果基类的构造函数用到参数,则派生类在其构造函数的初始化列表中必须为基类给出参数,就是这个原因。虚函数的意思就是开启动态绑定,程序会根据对象的动态类型来选择要调用的方法。然而在构造函数运行的时候,这个对象的动态类型还不完整,没有办法确定它到底是什么类型,故构造函数不能动态绑定。(动态绑定是根据对象的动态类型而不是函数名,在调用构造函数之前,这个对象根本就不存在,它怎么动态绑定?)编译器在调用基类的构造函数的时候并不知道你要构造的是一个基类的对象还是一个派生类的对象。析构函数设为虚函数的作用: 解释:在类的继承中,如果有基类指针指向派生类,那么用基类指针delete时,如果不定义成虚函数,派生类中派生的那部分无法析构。例:#include "stdafx.h" #include "stdio.h" class A { public: A(); virtual ~A(); }; A::A() { } A::~A() { printf("Delete class AP/n"); } class B : public A { public: B(); ~B(); }; B::B() { } B::~B() { printf("Delete class BP/n"); } int main(int argc, char* argv) { A *b=new B; delete b; return 0; } 输出结果为:Delete class B Delete class A 如果把A的virtual去掉:那就变成了Delete class A因此在类的继承体系中,基类的析构函数不声明为虚函数容易造成内存泄漏。所以如果你设计一定类可能是基类的话,必须要声明其为虚函数。正如Symbian中的CBase一样。Note:1. 如果我们定义了一个构造函数,编译器就不会再为我们生成默认构造函数了。2. 编译器生成的析构函数是非虚的,除非是一个子类,其父类有个虚析构,此时的函数虚特性来自父类。3. 有虚函数的类,几乎可以确定要有个虚析构函数。4. 如果一个类不可能是基类就不要申明析构函数为虚函数,虚函数是要耗费空间的。5. 析构函数的异常退出会导致析构不完全,从而有内存泄露的问题。最好是提供一个管理类,在管理类中提供一个方法来析构,调用者再根据这个方法的结果决定下一步的操作。6. 在构造函数不要调用虚函数。在基类构造的时候,虚函数是非虚,不会走到派生类中,既是采用的静态绑定。显然的是:当我们构造一个子类的对象时,先调用基类的构造函数,构造子类中基类部分,子类还没有构造,还没有初始化,如果在基类的构造中调用虚函数,如果可以的话就是调用一个还没有被初始化的对象,那是很危险的,所以C++中是不可以在构造父类对象部分的时候调用子类的虚函数实现。但是不是说你不可以那么写程序,你这么写,编译器也不会报错。只是你如果这么写的话编译器不会给你调用子类的实现,而是还是调用基类的实现。7. 在析构函数中也不要调用虚函数。在析构的时候会首先调用子类的析构函数,析构掉对象中的子类部分,然后在调用基类的析构函数析构基类部分,如果在基类的析构函数里面调用虚函数,会导致其调用已经析构了的子类对象里面的函数,这是非常危险的。8. 记得在写派生类的拷贝函数时,调用基类的拷贝函数拷贝基类的部分,不能忘记了。如果一个类是作为基类使用,那么他的虚构函数一定要是虚的,即用virtual关键字(参数为零则为纯虚函数).否则会有内存泄漏(很重要),因为当用基类的指针删除一个派生类的对象时,要调用派生类的析构函数.但是其子类或者子子类可以的析构函数可以是虚函数,也可以不是虚函数.(不加virtual 关键字则不会调用派生类的析构函数,而上面用了ClxBase *pTest = new ClxDerived;语句也就是new的ClxDerived对象没有 销毁,所以产生内存泄漏)2.类中的虚函数,如果一个类中的函数被声明成为虚函数,那么其子类不用在声明为虚函数(当子类还有子类时),也可以声明为虚函数.结果是一样的.同虚析构函数的道理是一样的.当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。
C++构造,析构函数可以是虚函数吗,是否可以被继承
构造函数不能为虚函数,析构函数则可以,在C++中函数没有继承一说,继承指的是类继承,
派生类的构造函数执行时需先构造基类的构造函数,
而析构函数的执行顺序则刚好相反。
c++析构函数、构造虚定义为虚函数的问题
1
不是不能定义,是定义了没意义。因为构造函数不被继承,而虚函数是要在派生类中重定义的
2
定义虚析构函数后,由于多态,当使用基类指针指向派生类对象时,会调用派生类的虚构函数,然后派生类的析构函数自动调用基本析构函数。不是虚的话,直接调用基类的析构函数了。如果派生类中有用new分配的内存,就无法释放了
c++什么是虚函数,构造与析构函数可以是虚函数吗_百度知道
定义虚函数是为了允许用基类的指针来调用派生类的这个函数。(实现了多态的特性)
构造函数不可以是虚函数,因为虚函数的存储空间(虚函数表)初始化是在构造函数中
(你想象一下,实例化的时候,虚构造函数的话,构造函数等自身来调用初始化不就矛盾了吗)
析构函数需要申明成虚函数,在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生
(如果基类的析构函数不是虚函数,释放指向派生类的基类指针时,就只会执行基类的析构函数,而不会去调用派生的析构函数)
c++中 析构函数中可以调用虚函数么
c++中 析构函数中不可以调用虚函数。
effective C++ 中有这样的描述:同样的原因也适用于析构过程。一旦派生类析构函数运行,这个对象的派生类数据成员就被视为未定义的值,所以 C++ 就将它们视为不再存在。
C++中派生类在构造时会先调用基类的构造函数再调用派生类的构造函数,析构时则相反,先调用派生类的析构函数再调用基类的构造函数。
假设一个派生类的对象进行析构,首先调用了派生类的析构,然后在调用基类的析构时,遇到了一个虚函数,这个时候有两种选择:Plan A是编译器调用这个虚函数的基类版本,那么虚函数则失去了运行时调用正确版本的意义;Plan B是编译器调用这个虚函数的派生类版本,但是此时对象的派生类部分已经完成析构,“数据成员就被视为未定义的值”,这个函数调用会导致未知行为。

本文相关文章:
matlab怎么用表达式绘曲线(用matlab 怎么画函数曲线图)
2025年11月2日 07:45
类的构造函数和析构函数(构造函数和析构函数的主要作用是什么它们各有什么特性)
2025年10月28日 20:30
matlab编写函数(matlab中自己编写的函数文件可以直接运行吗)
2025年10月28日 11:45
trim函数可以用来删除字符串中间包含的空格(怎么用trim函数来去除EXCEL表格中的空格)
2025年10月26日 23:30
oracle导出用户的存储过程(ORACLE如何实现函数、包、存储过程的导入和导出)
2025年10月24日 10:00
更多文章:
下载免费java(有什么无病毒、安全的网站可以免费下载java格式手机游戏,且是触屏全屏的)
2026年9月24日 18:00
php7连接mysql数据库操作(PHP7连接mysql数据库方法)
2025年12月29日 00:15
c语言终止程序(C语言~~~如何使程序中途结束、跳出~~~)
2025年6月5日 07:30
flex布局的兼容性(怎么用css使得input的输入框对齐,要写出代码,别百度其他的)
2026年7月27日 12:15
正则表达式支持库(怎样在aardio中使用正则表达式,用哪个函数)
2025年11月17日 05:30
腾讯云数据库管理工具(navicat导入mangodb几百万行传输中断)
2025年12月5日 03:30
java 线程安全(java中为什么说,String是线程安全的)
2026年5月1日 04:00
下载excel教程(windows家庭中文版的怎么下载excel教程)
2026年8月11日 20:15
delphi控制485(如何在delphi中使用海康威视的485口)
2026年9月4日 06:00
tengine windows(天龙八部报错是怎么回事啊 )
2026年2月14日 17:45
ctab化学名称?predictive与predictable的区别
2026年8月14日 15:30













