析构函数为什么总是虚函数2
来源:百度文库 编辑:神马文学网 时间:2024/05/21 06:02:01
为什么析构函数总是虚函数?如果这是必要的,那么为什么C++不把虚析构函数直接作为默认值?为什么纯虚析构函数可以通过编译,但是不能通过连接?
回答:
编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。
所以建议的方式是将析构函数声明为虚函数。如果你使用MFC,并且以CObject或其派生类为基类,那么MFC已经为你做了这件事情;CObject的析构函数是虚函数。一个函数一旦声明为虚函数,那么不管你是否加上virtual 修饰符,它在所有派生类中都成为虚函数。但是由于理解明确起见,建议的方式还是加上virtual 修饰符。
C++不把虚析构函数直接作为默认值的原因是虚函数表的开销以及和C语言的类型的兼容性。有虚函数的对象总是在开始的位置包含一个隐含的虚函数表指针成员。如果是对于MFC类CPoint和CSize这样的小型类,增加一个指针就增加了很多内存占用,而且使得其内存表示和基类POINT和SIZE不一致。如果两个类的内存表示一致,那么这样你可以安全地把一个类的指针或数组当作另一个类的指针或数组使用。 呵呵,这个只要你能弄明白类的多态特性就不难理解为什么析构函数要是虚函数,而且经常是虚函数了。
这个主要在下面这种情况有有很大作用
假如B继承A A *pa = new B;
//在delete pa的时候由于虚函数特性的存在,就会去析构B的对象,而非A的。
回答:
编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。
所以建议的方式是将析构函数声明为虚函数。如果你使用MFC,并且以CObject或其派生类为基类,那么MFC已经为你做了这件事情;CObject的析构函数是虚函数。一个函数一旦声明为虚函数,那么不管你是否加上virtual 修饰符,它在所有派生类中都成为虚函数。但是由于理解明确起见,建议的方式还是加上virtual 修饰符。
C++不把虚析构函数直接作为默认值的原因是虚函数表的开销以及和C语言的类型的兼容性。有虚函数的对象总是在开始的位置包含一个隐含的虚函数表指针成员。如果是对于MFC类CPoint和CSize这样的小型类,增加一个指针就增加了很多内存占用,而且使得其内存表示和基类POINT和SIZE不一致。如果两个类的内存表示一致,那么这样你可以安全地把一个类的指针或数组当作另一个类的指针或数组使用。 呵呵,这个只要你能弄明白类的多态特性就不难理解为什么析构函数要是虚函数,而且经常是虚函数了。
这个主要在下面这种情况有有很大作用
假如B继承A A *pa = new B;
//在delete pa的时候由于虚函数特性的存在,就会去析构B的对象,而非A的。
析构函数为什么总是虚函数2
构造函数为什么不能是虚函数
C++箴言:避免析构函数调用虚函数
基类的析构函数为什么要设成虚函数 - so true - BlogJava
虚函数
C 面向对象编程入门:构造函数与析构函数2
构造函数、析构函数和赋值操作符
C++虚函数表解析
C++ 虚函数表解析
为多态基类声明virtual析构函数
虚函数布局
C++中的虚函数
Excel函数教程2
Excel函数2
VB函数2
函数空间2
通达信函数大全2
C 面向对象编程入门:构造函数与析构函数1
C 面向对象编程入门:构造函数与析构函数4
C 面向对象编程入门:构造函数与析构函数5
C 面向对象编程入门:构造函数与析构函数6
c 面向对象的编程入门篇--类构造函数与析构函数
C++面向对象编程入门:构造函数与析构函数
PHP5的对象模型[4]--构造函数和析构函数 - Haohappy的专栏--PHP5研究...