C++ 虚析构函数

来源:互联网 发布:征途2怎么延时网络 编辑:程序博客网 时间:2024/05/20 09:47

1.对于一个空类型,sizeof求得的结果是1
这就是实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以空类所占的内存大小是1个字节。
一旦类中有其他的占用空间成员,则这1个字节就不在计算之内。
增加了构造函数和析构函数后:
由于构造函数和析构函数的调用与类型的实例无关(调用它们只需要知道函数地址即可),在它的实例中不需要增加任何信息。
将析构函数改为虚析构函数后:
class C在class B的基础上把析构函数标注为虚拟函数。C++的编译器一旦发现一个类型中有虚拟函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针。在32位的机器上,一个指针占4个字节的空间,因此sizeof(C)是4。

#include <iostream>using namespace std;class A{public:    A();    virtual ~A();};int main(){    cout << sizeof(A) << endl;    return 0;}

2.C++用作基类的类的析构函数一般都是虚函数,这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。
并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。

原创粉丝点击