一般通过虚函数表(virtual function table)实现。
虚函数表存放虚函数的函数地址
只要类中定义了虚函数,编译器自动添加隐藏指针vfptr指向虚函数表。
指针vfptr通常在对象内存的首地址
派生类继承基类的虚函数表,如果重写基类虚函数,则覆盖基类虚函数。
只有通过基类指针或引用访问虚函数才能获得运行时的多态性
#include#include using namespace std; class B { public: virtual void f1() { cout << "B:f1()" << endl; } virtual void f2() { cout << "B:f2()" << endl; } void g() { cout << "B:g()" << endl; f1(); f2(); } }; class D :public B { public: virtual void f1() { cout << "D:f1()" << endl; } virtual void f3() { cout << "D:f3()" << endl; } void g() { cout << "D:g()" << endl; f1(); f2(); } }; int main() { D d; D* pd = &d; B* pb = &d; B b = d; b.f1(); cout<<"=====n"; b.f2(); cout<<"=====n"; b.g(); cout<<"=====n"; pb->f1(); cout<<"=====n"; pb->f2(); cout<<"=====n"; pb->g(); cout<<"=====n"; pd->f1(); cout<<"=====n"; pd->f2(); cout<<"=====n"; pd->f3(); cout<<"=====n"; pd->g(); }



