构造函数可以是虚函数?
简单来说:
- 构造函数不能为虚函数,而析构函数可以且常常是虚函数。
为何构造函数不可以是虚函数?
对于C++中的对象的构造而言,C++对象在三个地方构建:
- 函数堆栈
- 自由存储区(堆)
- 静态存储区
构造过程主要分成两步:
- (1)分配一块内存
- (2)调用构造函数
假如说构造函数是虚函数,那么就需要通过vtable 来调用,但此时面对一块 raw memeory,根本无法寻找到vtable,因为vtable是在构造函数中初始化的。
因此,构造函数不可以是虚函数。
析构函数可以使虚函数?
可以。
因为此时vtable已经被初始化了,而且通常通过基类的指针来销毁对象,如果析构函数不为虚的话,就不能正确识别对象类型,从而不能正确销毁对象。
参考文章:
C++:构造函数和析构函数能否为虚函数