• C++:多态、多态的实现及优点、虚函数(纯虚函数)


    三、多态

    一个函数接口可以实现不同的状态(一个接口函数多个功能)

    1、多态分类

    (1)静态多态:地址早绑定,编译阶段确定函数地址。代表:函数重载、运算符重载

    (2)动态多态:地址晚绑定,运行阶段确定函数地址.

    2、多态的实现

    (1)实现条件:

    1)类之间需要有继承关系

    2)实现多态的函数需要以virtual来进行声明. (虚函数)

    3)父类中的虚函数需要被子类重写

          重写:返回值、函数名、参数都必须一致.

    (2)语法

    class A

    {

    virtual void fun(int_ _n1);

    };

    class B:pub1ic A

    {

    virtual void fun(int_ n1); //重写A中的虚函数。

    };

    (3)多态的优点:实际开发中,建议多用多态设计程序

                 1) 结构清晰,便于理解

                2) 利于后期代码扩展、维护.实现了对修改屏蔽、对扩展开放.

    (4)多态接口实现:

    需要使用父类指针或父类引用指向子类对象,直接将子类对象赋值给父类对象是不行的.

    1)

    Base *b =

    new Son1; //父类指针指向子类对象

    b->fun(); //调用 子类中的函数。

    2)Son1 s1;

    Base &b = s1;

    b. funO; / /调用子类中的函数

    Base b2;

    b2 = s1;

    代码01):多态的实现

    1. #include
    2. using namespace std;
    3. class Animal
    4. {
    5. public:
    6. virtual void Speak()
    7. {
    8. cout<<"animal speak"<
    9. }
    10. };
    11. class Cat:public Animal
    12. {
    13. public:
    14. virtual void Speak()
    15. {
    16. cout<<"cat speak"<
    17. }
    18. };
    19. class Dog:public Animal
    20. {
    21. public:
    22. virtual void Speak()
    23. {
    24. cout<<"dog speak"<
    25. }
    26. };
    27. void AnimalSpeak(Animal &a1)
    28. {
    29. a1.Speak();
    30. }
    31. void test01()
    32. {
    33. Animal a2;
    34. AnimalSpeak(a2);
    35. Dog d1;
    36. AnimalSpeak(d1);
    37. Cat c1;
    38. AnimalSpeak(c1);
    39. }
    40. int main(int argc, char *argv[])
    41. {
    42. test01();
    43. return 0;
    44. }

    代码02):多态的优点

    1. #include
    2. using namespace std;
    3. #include
    4. using namespace std;
    5. class Calculator
    6. {
    7. public:
    8. Calculator():_num1(0), _num2(0)
    9. {
    10. }
    11. virtual int CalculateFun()
    12. {
    13. return 0;
    14. }
    15. int _num1;
    16. int _num2;
    17. };
    18. class AddCal: public Calculator //利于后期代码扩展、维护.
    19. {
    20. public:
    21. AddCal()
    22. {
    23. _num1 = 0;
    24. _num2 = 0;
    25. }
    26. AddCal(int n1, int n2)
    27. {
    28. _num1 = n1;
    29. _num2 = n2;
    30. }
    31. int CalculateFun()
    32. {
    33. return _num1 + _num2;
    34. }
    35. };
    36. int CalResultFun(Calculator &cal)
    37. {
    38. int ret = cal.CalculateFun();
    39. return ret;
    40. }
    41. void test01()
    42. {
    43. AddCal c1(23, 56);
    44. cout << CalResultFun(c1) << endl;
    45. }
    46. int main()
    47. {
    48. test01();
    49. return 0;
    50. }

    3、虚函数

    (1)就是virtual 修饰的成员函数.

    (2)虚函数要求必须有实现过程,不能只是声明.

    class A

    {

    virtual void fun(int);    //声 明

    }

    void A: :fun(int_ n1)     //实现过程

    {

    }

    (3)纯虚函数:

    1)有时候,父类里面的虚函数根本没有实现的必要,此时可以声明为纯虚函数.不用具体实现。

    class A

    virtual void fun(int) = 0;   //纯虚函数声明

    2) 有纯虚函数的类被称为抽象类,抽象类不能实例化对象.

    4、析构函数

    在多态的使用过程中,如果子类对象空间开辟到堆区(使用new方式),那么父类指针在释放时无法调用子类的析构代码。将父类中的析构改为虚析构,则可以解决该问题.

  • 相关阅读:
    【数据库系统概论】作业4 第四章 习题6|7 、第五章 习题6
    01 - SQL概述与SQL分类
    pH值、EC控制器
    【阅读笔记】《深度学习》第二章:线性代数
    map和set
    【校招VIP】前端计算机网络之webSocket相关
    java计算机毕业设计ssm气象百事通系统-天气预报系统
    (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
    减少延迟时间的方法
    vue - 解决vue : 无法加载文件 C:\Users\hp\AppData\Roaming\npm\vue.ps1,因为在此系统上禁
  • 原文地址:https://blog.csdn.net/qq_63626307/article/details/126755599