虚函数
基类希望派生类定义适合自己的版本,就把这些函数声明成虚函数
虚函数的工作原理:
每个包含虚函数的类有一个虚函数表(vtable),它是指向虚函数实现的指针数组。对象有一个指向其类的vtable的指针,通常在其内存布局开始处(以便快速访问)。通过基类指针调用虚函数时,首先找到对象的vtable指针,然后在vtable中查找函数指针来调用。这种运行时解析被称为动态绑定或运行时多态。
虚函数的调用在程序运行时进行解析。这也被称为动态绑定或运行时多态性。在编译时,编译器不知道应该调用哪个类的虚函数实现,具体的实现取决于程序运行时指向的对象类型。
工作原理导致下面两个现象
构造函数不能是虚函数,而析构函数应是虚函数
- 在对象构造时,vtable尚未完全设置,所以不能保证正确的多态行为。
- 析构函数应该是虚函数,以确保正确删除派生类对象并释放其资源。
构造函数:
# 错例
class A {
public:
A() {
call();
}
virtual void call() {
}