对于非虚非静态成员函数的调用,是在编译期间就明确了的。简单地说,调用的时候将this指针传入函数,后面根据this指针指向的对象执行程序。但是在虚函数中却不一样。
一、虚函数执行原理:虚函数指针和虚函数表
虚函数表:存在于常量区,为一个类所公有,其中记录了多个虚函数指针,分别指向该类中定义的所有虚函数。注意,父类和子类的分别有两个虚函数表。
虚函数指针:存在于每一个对象中,指向这个对象的类型对应的那一张虚函数表。
看代码:
class Father{
public:virtual void f(){cout<<"I am father"<<endl;}
};int main() {Father * ptr = new Father;ptr->f();
}
ptr->f()执行过程如下:
(1)通过ptr指针找到堆上的Father对象;
(2)在这个对象上,找到虚函数表指针;
(3)在虚函数表里面找到