C++虚函数指针与虚函数表

  1. 当父类中某个方法有virtual关键字修饰,则该方法被放入虚函数表中,同时,有一个指针指向该父类的虚函数表。
  2. 当子类继承父类后,子类会继承父类的虚函数指针和虚函数表,(在子类构造函数调用时)会将自己的虚函数指针指向自己的虚函数表,但是如果子类重写了该方法(加virtual或者不加都可以,但是方法必须完全相同包括返回值),那么子类的虚函数表中的函数则会改变。
  3. 父类指针指向子类对象时,发生动态联编,如果虚函数表被重写,则调用父类虚函数会指向被重写的方法,否则父类指针指向自身的方法,是静态联编。

 

当父类指针(子类指针)指向子类对象(父类对象时)

没有指定虚函数,  那么它就只能访问到类型对应的函数
基类指针就只能访问到基类函数
子类指针就只能访问到子类函数

 

如果基础类和衍生类定义了相同名称的成员函数,那么通过对象指针调用成员函数时,到底调用那个函数要根据指针的原型来确定,而不是根据指针实际指向的对象类型确定

如果指针原型中某个成员函数被重写,则调用时会指向该被重写的函数。如果没有被重写,则指向该指针原型本身的成员函数。

C++虚函数指针与虚函数表

 

输出:

C++虚函数指针与虚函数表

重点在于:父类指针指向子类对象,用该指针调用方法时是根据父类指针来判断的。深层原理:1.多态,产生动态联编,如果虚函数被重写,那么子类的虚函数指针发生改变 2.静态联编的方法不会改变