1.派生类先继承基类的虚函数表,如果派生类重新定义基类的虚函数,则会覆盖相应的表项,如果派生类定义了新的虚函数,则按照声明的顺序扩充虚函数表。
2. 注意:对于同时存在于基类和派生类的虚函数,派生类虚函数表的顺序是按照基类虚函数的声明顺序排列的,与派生类声明顺序无关(微信面试题)。
#include <iostream> #include <cmath> using namespace std; class Base { public: virtual void f() { cout << "Base::f" << endl; } virtual void g() { cout << "Base::g" << endl; } virtual void h() { cout << "Base::h" << endl; } }; class Derived : public Base { void g() { cout << "Derived::g" << endl; } void h() { cout << "Derived::h" << endl; } void f() { cout << "Derived::f" << endl; } virtual void i() { cout << "Derived::i" << endl;} }; int main() { Base base; typedef void(*pFun)(); pFun pfun; cout << "Based---------------------------------------" << endl; for (int i = 0; i < 3; i++) { pfun = (pFun)*((int *)*(int *)(&base) + i); pfun(); } cout << "Derived-------------------------------------" << endl; Derived derived; for (int i = 0; i < 4; i++) { pfun = (pFun)*((int *)*(int *)(&derived) + i); pfun(); } return 0; }