3.构造函数能否声明为虚函数或者纯虚函数,析构函数呢?
3.构造函数能否声明为虚函数或者纯虚函数,析构函数呢?
构造函数
不能声明为虚函数,也不能是纯虚函数。
原因:
- 虚函数依赖虚表指针(vfptr)
- 虚表指针是在构造函数执行期间才初始化的
- 构造函数本身还没执行时,对象还不存在,没有虚表
- 语法上直接不允许
结论:
构造函数不能是 virtual /pure virtual。
析构函数
可以是虚函数,也可以是纯虚函数
- 析构函数可以是虚函数(非常常用)
- 析构函数也可以是纯虚函数,但必须提供实现体
class Base {
public:
virtual ~Base() = 0;
};
// 纯虚析构必须实现
Base::~Base() {}
原因:
- 子类析构后会自动调用基类析构
- 如果基类纯虚析构没有实现,链接会报错
一句话背诵(面试满分)
构造函数不能是虚函数或纯虚函数,因为对象未构造完成,没有虚表;
析构函数可以是虚函数,也可以是纯虚函数,但纯虚析构必须提供实现。

浙公网安备 33010602011771号