• 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方式),那么父类指针在释放时无法调用子类的析构代码。将父类中的析构改为虚析构,则可以解决该问题.

  • 相关阅读:
    中石油测井-技术研发岗回顾
    [网络工程师]-应用层协议-电子邮件协议
    数据挖掘与分析课程笔记(Chapter 14)
    液晶显示计算器(延时程序)
    JavaScript Promise
    0202hdfs的shell操作-hadoop-大数据学习
    JavaScript基础(5)_运算符
    C++八皇后问题代码
    v-html有什么问题
    奇妙的房树人测验:教你看画识人心
  • 原文地址:https://blog.csdn.net/qq_63626307/article/details/126755599