虚函数、虚函数表、虚函数表指针

1.虚函数表什么时候生成?

编译器编译的时候生成

2.虚函数表存放在哪里?

讨论两种情况:在磁盘(可执行程序)、在内存(运行状态)

实际上不同的编译器把虚函数表放的位置也不同,有放代码段的,也有放在数据段的

3.虚函数表与虚函数表指针的关系

每个类只有一个虚函数(有虚函数的类)

类的不同对象,通常虚函数表指针是不一样的(拷贝构造/opertor=需要深拷贝)

4.虚函数表指针的创建时机

①类对象构造的时候创建虚函数表指针,并且把类的虚函数表地址赋值给vptr

②继承的情况下,虚函数表指针赋值过程?class B : public class A

a.首先调用父类构造函数,把A的虚函数表的地址赋值给vptr

b.然后调用子类构造函数,把B的虚函数表的地址赋值给vptr

5.虚析构函数的作用

背景:析构函数的函数名会被编译器统一处理成destructor,这样函数名就一样了 满足重写条件

重写的函数,哪个类型调用,就调用哪个类型的函数

Father f; f.func(); // 调用父类的

Child c; c.func(); // 调用子类的

Father* pf = new Child; // 因为是父类指针,所以调用父类的

所以父类指针指向子类对象的情况下,在调用析构函数的时候,子类对象的析构函数得不到调用,这样子类的资源肯能得不到释放,造成内存泄漏

在继承下,为了使子类析构函数能够得到正常调用,需要将父类的析构函数设置为虚析构函数

这样父类的析构函数与子类的析构函数构成了虚函数重写,Father* pf = new Child也会调用子类的析构函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值