多态的基本概念

多态是C++面向对象三大特性之一
多态分为两类

  • 静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名
  • 动态多态: 派生类和虚函数实现运行时多态

静态多态和动态多态区别:

  • 静态多态的函数地址早绑定 - 编译阶段确定函数地址
  • 动态多态的函数地址晚绑定 - 运行阶段确定函数地址
    1. #include <iostream>
    2. #include <string>
    3. using namespace std;
    4. class Animal {
    5. public:
    6. void func() {
    7. cout << "动物在叫" << endl;
    8. }
    9. };
    10. class Cat : public Animal {
    11. public:
    12. void func() {
    13. cout << "喵喵喵" << endl;
    14. }
    15. };
    16. class Dog : public Animal {
    17. public:
    18. void func() {
    19. cout << "汪汪汪" << endl;
    20. }
    21. };
    22. void DoSpeak(Animal& animal)
    23. {
    24. animal.func();
    25. }
    26. void example() {
    27. Cat cat;
    28. DoSpeak(cat);
    29. }
    30. int main() {
    31. example();
    32. return 0;
    33. }
    此时不论传什么,都会调用父类
    1. #include <iostream>
    2. #include <string>
    3. using namespace std;
    4. class Animal {
    5. public:
    6. virtual void func() {
    7. cout << "动物在叫" << endl;
    8. }
    9. };
    10. class Cat : public Animal {
    11. public:
    12. void func() {
    13. cout << "喵喵喵" << endl;
    14. }
    15. };
    16. class Dog : public Animal {
    17. public:
    18. void func() {
    19. cout << "汪汪汪" << endl;
    20. }
    21. };
    22. void DoSpeak(Animal& animal)
    23. {
    24. animal.func();
    25. }
    26. void example() {
    27. Cat cat;
    28. DoSpeak(cat);
    29. }
    30. int main() {
    31. example();
    32. return 0;
    33. }
    加上Virtual后,则变为想要的结果。