第五十五课 问题解析
文章目录
一、new 和 malloc 的区别和 delete 和 free 的区别是什么?
-
new 和 malloc 的区别
new 关键字是C++的一部分,malloc 是由C库函数提供
new以具体类型为单位进行内存分配,malloc以字节为单位进行内存分配
new在申请内存空间时可以进行初始化,malloc仅根据需要申请定量内存的空间
new在所有C++编译器中都被支持,malloc 早某些系统开发中不能调用
new能够出发构造函数的调用,malloc仅分配需要的空间
对象的创建只能用new,malloc不适合面向对象的开发
-
delete和free的区别
delete在所有C++编译器中都被支持,free在某些系统开发中不能调用
delete能够出发析构函数的调用,free仅归还之前分配的内存空间
对象销毁只能用delete,free不适合面向对象开发
二、构造函数和析构函数时候可以成为虚函数
-
构造函数不可能成为虚函数
在构造函数执行结束后,虚函数表指针才会被正确初始化
-
析构函数可以成为虚函数
建议在声明类时,将析构函数声明为虚函数
三、构造函数和析构函数是否可以发生多态
-
构造函数里面不可能发生多态行为
在构造函数执行时,虚函数表指针未被正确初始化
-
虚构函数中不可能发生多态
析构函数执行时,虚函数表指针已经被销毁
四、继承中如何正确的使用强制类型转换
-
dynamic_cast 是与继承相关的类型转换关键字
-
dynamic_cast 要求相关函数的类中必须有虚函数
-
用于有直接或者间接继承关系的指针(引用)之间
指针:
- 转换成功:得到目标类型的指针
- 转换失败:得到一个空指针
引用:
- 转换成功:得到目标类型的引用
- 转换失败:得到一个异常操作信息
-
dynamic_cast 编译器会检查是否使用正确
-
类型转换的结果只能在运行阶段才能看得到
五、小结
- new /delete 会触发构造函数/析构函数的调用
- 构造函数不能成为虚函数
- 析构函数可以成为虚函数
- 构造函数和析构函数都无法产生多态性为
- dynamic_cast是与继承相关的专用关键字