C++中基类的析构函数为什么要用virtual虚析构函数

2025-04-08 22:56:05
推荐回答(1个)
回答1:

并不一定哦。
如果基类并不是为多态设计而准备的,那么很有可能不应该设计成虚析构,因为虚表指针在每个对象中会占用空间,举例:
class point{
public:
int x;
int y;
}
现在需要用point描述一幅图,假定有10000个点,如果不设计虚析构,那么占用空间10000*2*sizeof(int)字节,但是如果设计虚析构则占用10000*(2*sizeof(int)+sizeof(int*))字节,int*的大小和虚表指针大小是一样的。很显然point没有必要设计成有虚析构函数,浪费空间。
一般的建议是,如果类的体系考虑多态的需要,就有必要设计成虚析构函数,理由是指针方式的delete时或基类引用派生类对象时能够正确析构实际指向的对象。
以引用方式为例:
#include
using namespace std;
class A{
public:
~A() {
cout << "A" << endl;
}
};
class B :public A{
public:
~B() {
cout << "B" << endl;
}
};
void fun() {
B b;
A &a = b;
}
int main() {
fun();
system("pause");//这句只是让你看见结果,不至于一闪而逝,没有其他作用,可以去掉
return 0;
}