“多态”的关键在于通过基类指针或引用调用一个虚函数时,编译时不确定到底调用的时基类还是派生类的函数,运行时才确定——这叫“动态联编”
观察如下程序:
多态实现的关键——虚函数表
- 类的前四个字节存放虚函数表的指针
实例证明
class A {
public:
virtual void Func() {cout << "A::Func" << endl;}
};
class B:public A {
public:
virtual vodi Func() {cout << "B::Func" << endl;}
};
main() {
A a;
A * pa = new B();
pa->Func(); // 输出B::Func
// 64位程序指针位8字节
long long * p1 = (long long*) & a;
long long * p2 = (long long*) pa;
*p2 = *p1; // 将a的虚函数表地址给pa
pa->Func(); // 输出A::Func
}