每个类中存在虚函数时,当构造一个对象时,系统会为对象分配相应的内存空间。但是虚函数表存放在程序的只读数据段中,在实例化对象时,编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable;
下面看一个小例子:
#include<iostream>
using namespace std;class A {
public:void f1() {cout << "f1" << endl;}virtual void f2() {cout << "f2" << endl;}
};int main() {A* a = nullptr;a->f1();a->f2();system("pause");return 0;
}
此时a->f1();
可以正常运行,a->f2();
无法运行,报错如下:
推测,在构造对象a时,A* a = nullptr;
,因为是空的,所以无法在栈区分配空间,自然指向虚函数表的指针就不存在了,所以无法找到虚函数表,来正确调用虚函数。
那么,如果构造对象时,为其分配栈区的空间时,可以调用到虚函数吗??
那就将A* a = nullptr;
改为A* a = new A();
,运行结果如下: