多态实现方式是虚函数和虚函数表的覆盖。

    1. #include <iostream>
    2. #include <string>
    3. using namespace std;
    4. class Base {
    5. public:
    6. virtual void Action() {
    7. cout << "Base function action" << endl;
    8. }
    9. };
    10. class Derived1 : public Base {
    11. void Action() {
    12. cout << "Derived1 function action" << endl;
    13. }
    14. };
    15. class Derived2 : public Base {
    16. void Action() {
    17. cout << "Derived2 function action" << endl;
    18. }
    19. };
    20. void TakeAction(Base& base) {
    21. base.Action();
    22. }
    23. void example() {
    24. Derived1 Der;
    25. TakeAction(Der);
    26. }
    27. int main() {
    28. example();
    29. return 0;
    30. }

    在此案例中,Base类有一个虚函数,这个虚函数指向了一个虚函数表
    同时继承它的子类也会有一个虚函数表,当子类的虚函数表存在时,子类的虚函数表会覆盖父类的虚函数表,从而实现多态。
    此时base的布局如下

    1. class Base size(4):
    2. +---
    3. 0 | {vfptr}
    4. +---
    5. Base::$vftable@:
    6. | &Base_meta
    7. | 0
    8. 0 | &Base::Action
    9. Base::Action this adjustor: 0

    Derived1布局如下

    1. class Derived1 size(4):
    2. +---
    3. 0 | +--- (base class Base)
    4. 0 | | {vfptr}
    5. | +---
    6. +---
    7. Derived1::$vftable@:
    8. | &Derived1_meta
    9. | 0
    10. 0 | &Derived1::Action

    但是如果Base中的函数不是虚函数,那么此时继承类的布局如下:

    1. class Derived1 size(1):
    2. +---
    3. 0 | +--- (base class Base)
    4. | +---
    5. +---