C++编译与运行:其三、虚函数、虚表和多态

对于非虚非静态成员函数的调用,是在编译期间就明确了的。简单地说,调用的时候将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)在虚函数表里面找到

你可能感兴趣的:(c++,开发语言)