一般通过虚函数表(virtual function table)实现。
虚函数表存放虚函数的函数地址
只要类中定义了虚函数,编译器自动添加隐藏指针vfptr指向虚函数表。
指针vfptr通常在对象内存的首地址
派生类继承基类的虚函数表,如果重写基类虚函数,则覆盖基类虚函数。
只有通过基类指针或引用访问虚函数才能获得运行时的多态性
#include<cstdio>
#include<iostream>
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();
}