C++对象的构造析构函数与虚表指针

Effective C++: 不要在构造函数和析构函数中调用任何虚函数

        对于包含虚函数的C++对象,都会有一个虚表指针vptr指向一个虚函数列表,这个虚表是属于这个类的,也就是所有这个类对象持有同一个虚表指针。那么这个这个指针时何时被赋予的,用VS调试了下,过程如下:

假设class Student: public Person

Person* p = new Student;

在Student的构造中,

1.首先会进入Person的构造函数,这个时候vptr指针指向的是Person类的虚表。这就是在父类构造函数中调用虚函数不生效的原因,因为这个时候vptr还是Person自己的。

2.构造Student类成员,这个时候vptr还是指向Person的虚表

3.进入Student构造函数。这个时候vptr已经是指向Student类的虚表了。

构造类成员对象->vptr赋值->调用该类构造函数。

从上面的情况看,在构造函数中调用虚函数是可以的,只是可能不会是想要的结果,因为虚函数指针还是当前类,不会有任何多态效果。

 

delete p;

那么在析构时会发生什么:

1.调用Student析构函数,这个时候发现vptr已经替换成指向Person的指针了

2.调用Student成员对象的析构函数

3.调用Person析构函数

所以也不要指望Person析构函数中的虚函数会起作用,因为在轮到他执行的时候指针已经指向Person的虚表了。

 

以上是在VS编译器中调试的结果,其他编译器中还不清楚。所以要求就是最开始调到的那句。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值