c++多态相关知识整理

c++多态相关知识整理

1. 指针类型与申请内存类型:
base *b = new derived(); //可以
derived *d = new base(); //不可以
子类内存里包括了父类的内容,所以子类指针转为父类指针可以截取父类长度的内容转为父类指针(切片); 反之父类指针转为子类指针时,多余的空间无法确定(越界)。

2. 构造函数、析构函数里的多态问题:
结论:
构造函数和析构函数调用虚函数时都不使用动态联编,如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数自身类型定义的版本。
原因:
(1)不要在构造函数中调用虚函数的原因:因为父类对象会在子类之前进行构造,此时子类部分的数据成员还未初始化, 因此调用子类的虚函数是不安全的,故而C++不会进行动态联编。
(2)不要在析构函数中调用虚函数的原因:析构函数是用来销毁一个对象的,在销毁一个对象时,先调用子类的析构函数,然后再调用基类的析构函数。所以在调用基类的析构函数时,派生类对象的数据成员已经“销毁”,这个时再调用子类的虚函数已经没有意义了。

3. 虚析构函数:

  • 没有虚构造函数(可用其他方式实现),因为在对象完全构造之前是没有类型的,也不存在虚表,所以虚构造函数也就不可能发生。
  • 父类指针指向子类内存时,不调用父类的析构函数。这个时候需要父类的析构函数变为虚析构函数才能被调用(没有被继承且没有虚函数的不用虚析构,因为会增加虚函数指针的大小;反之需要使用虚析构来释放父类的资源)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值