“多态”的关键在于通过基类指针或引用调用一个虚函数时,编译时不确定到底调用的时基类还是派生类的函数,运行时才确定——这叫“动态联编”
观察如下程序:
image.png

多态实现的关键——虚函数表

  • 类的前四个字节存放虚函数表的指针

image.png
image.png

实例证明

  1. class A {
  2. public:
  3. virtual void Func() {cout << "A::Func" << endl;}
  4. };
  5. class B:public A {
  6. public:
  7. virtual vodi Func() {cout << "B::Func" << endl;}
  8. };
  9. main() {
  10. A a;
  11. A * pa = new B();
  12. pa->Func(); // 输出B::Func
  13. // 64位程序指针位8字节
  14. long long * p1 = (long long*) & a;
  15. long long * p2 = (long long*) pa;
  16. *p2 = *p1; // 将a的虚函数表地址给pa
  17. pa->Func(); // 输出A::Func
  18. }