欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

类和对象—多态

发布时间:2025/4/5 35 豆豆
生活随笔 收集整理的这篇文章主要介绍了 类和对象—多态 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

多态的基本语法

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

静态多态和动态多态的区别

  • 静态多态的函数地址早绑定,编译阶段确定函数地址
  • 动态多态的函数地址晚绑定,运行阶段确定函数地址

早绑定代码如下:

#include <iostream> using namespace std;class Animal{public:void speak(){cout << "动物在说话"<< endl;} }; class Cat:public Animal{public:void speak(){cout << "猫在说话" <<endl; } };void doSpeak(Animal &animal){ //这个函数是早绑定,在编译阶段就已经绑定,所以无论传进来的参数是啥,最终的结果都是 动物在说话 animal.speak(); }void test01(){Cat c1;doSpeak(c1); } int main(){test01();return 0; } #include <iostream> using namespace std;class AbstractCalculator{ public:virtual int getResult(){return 0;}int m_Num1;int m_Num2; };class AddCalculator:public AbstractCalculator{ public:int getResult(){return m_Num1+m_Num2;} };class SubCalculator:public AbstractCalculator{ public:int getResult(){return m_Num1-m_Num2;} };class MulCalculator:public AbstractCalculator{ public:int getResult(){return m_Num1*m_Num2;} };void test01(){AbstractCalculator *p = new AddCalculator;p->m_Num1 = 100;p->m_Num2 = 100;cout << p->getResult() << endl;delete p;//减法运算p = new SubCalculator;p->m_Num1 = 100;p->m_Num2 = 100;cout << p->getResult() << endl;delete p;//乘法运算p = new MulCalculator;p->m_Num1 = 100;p->m_Num2 = 100;cout << p->getResult() << endl;delete p; } int main(){test01();return 0; }

晚绑定代码:

class Animal{public:virtual void speak(){ //加上virtual 关键字 变为虚函数cout << "动物在说话"<< endl;} }; void doSpeak(Animal &animal){ //Animal &animal = c1animal.speak(); }

总结:
动态多态的满足条件

  • 有继承关系
  • 子类重写父类的虚函数 //重写和重载不同,重写要求函数名称、返回值、参数列表完全相同
  • 动态多态的使用
    父类的指针或者引用 指向子类的对象

    动态多态的原理剖析

    void test02(){cout << sizeof(Animal) << endl; }

    结果为4,说明是一个指针

    计算器案例:

    #include <iostream> using namespace std;class AbstractCalculator{ public:virtual int getResult(){return 0;}int m_Num1;int m_Num2; };class AddCalculator:public AbstractCalculator{ public:int getResult(){return m_Num1+m_Num2;} };class SubCalculator:public AbstractCalculator{ public:int getResult(){return m_Num1-m_Num2;} };class MulCalculator:public AbstractCalculator{ public:int getResult(){return m_Num1*m_Num2;} };void test01(){AbstractCalculator *p = new AddCalculator;p->m_Num1 = 100;p->m_Num2 = 100;cout << p->getResult() << endl;delete p;//减法运算p = new SubCalculator;p->m_Num1 = 100;p->m_Num2 = 100;cout << p->getResult() << endl;delete p;//乘法运算p = new MulCalculator;p->m_Num1 = 100;p->m_Num2 = 100;cout << p->getResult() << endl;delete p; } int main(){test01();return 0; } 《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

    总结

    以上是生活随笔为你收集整理的类和对象—多态的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。