关于C++虚析构函数
来源:互联网 发布:淘宝无线端新品上架 编辑:程序博客网 时间:2024/05/22 06:37
在上一篇博文《关于C++对象的自杀》末尾提到了基类的虚析构函数,于是再添一篇。
什么时候析构函数需要加个virtual来修饰呢?
当要通过指向基类的指针删除子类对象时。
Why?
这是为了保证基类和子类的析构函数都得到调用。
个人理解:因为基类类型的指针指向的是子类对象中的基类部分,如果析构函数不为虚函数,则无法调用到子类的析构函数。
如下代码:
输出为:
说明了基类析构函数不为虚函数时,delete指向基类的指针时无法调用到子类的析构函数。
将基类析构函数修改为虚函数,得到如下代码:
输出为:
此时,子类的析构函数得到调用。
个人理解:
这是因为基类中将析构函数声明为虚函数,则析构函数(的索引/指针)会被放在虚表vtbl中。
在继承过程中,vtbl属于基类部分,即基类类型的指针p可以指到的范围。
并且,析构函数的虚函数性质会在继承过程中得到保持(虽然函数名不同),于是子类的析构函数也位于虚表中,确保delete p时可以调用到子类的析构函数。
于是,析构函数自底向上得到调用了。
最后引用C++ FAQ的一个段落:
BTW, if you're interested, here are the mechanical details ofwhy youneed a virtual destructor when someone says delete using a Base pointerthat's pointing at a Derived object. When you say delete p, and theclass of p has a virtual destructor, the destructor that getsinvoked is the one associated with the type of the object*p, notnecessarily the one associated with the type of the pointer. This is A GoodThing. In fact, violating that rule makes your program undefined. Thetechnical term for that is, "Yuck."
- 关于C函数
- C++:关于构造函数
- 【C++】关于指针函数
- C语言--关于函数
- 关于c++pow()函数
- 关于单片机 C中断函数
- 关于C/C++函数指针
- C语言 关于fgetc 函数
- 关于Lua调用C函数
- 关于C语言函数指针
- 关于C语言函数gethostbyname
- 关于c函数中的参数 "..."
- 关于c语言srand函数
- 关于C语言中的函数scanf函数
- C++::关于虚函数,纯虚函数
- 关于C函数指针的一个解答
- [C++]关于内联函数的使用
- 关于c语言的随机函数rand()
- ubuntu下shell脚本运行异常:bash和dash的区别
- 动态规划--计划一个公司聚会
- 【每日一文101106】新的开始
- 1029
- 自动获得internet时间并更新系统时间
- 关于C++虚析构函数
- Linq to SharePoint 之 parameters的使用
- 社交网数据库技术分析
- LU算法
- 换行符‘/n’和回车符‘/r’ 以及 ASCII码表
- 配置完了要设置conky自启动问题
- vrml 虚拟现实语言设计
- 12大使用电脑误区
- 删除旧版glib