多态:即一个接口多种实现方式;C++中的多态分为两种:静态多态与动态多态

一、静态多态:也成为编译时的多态;在编译时期就已经确定要执行了的函数地址了;主要有函数重载和函数模板(这里只写函数重载)

(1)重写基类函数(方法)

C++中当我们一个类继承于一个另一个类时,我们在派生类中不想使用基类中的函数,想重新写一个同名函数,这是被允许的;因此我们的基类与派生类可以有同名的函数;例如我们现在有一个类中已经有了一个函数名为show无参的函数,我们在派生类中再写一个名为show函数,这叫函数重载也称为覆盖和重写;

测试代码:

#include <iostream>using namespace std;class AA
{public:void show(){cout << "我是show1" << endl;}
};class BB :public AA
{public:void show(){cout << "我是show2" << endl;}
};int main()
{BB a;a.show(); //输出show2//a.show(); //此时会报错:没有匹配的函数,因为已经被重写了基类中的函数//a.AA::show();//正常输出AA类中的数据return 0;
}

运行结果:

因为此时派生类中重写了父类中的同名函数,因此在BB类中看到的show的函数是派生类中的重写后的show函数;其实AA类中的show函数还是存在的,并不是说重写了函数后,它就不存在了因此我们还是可以通过指定类中=名去调用AA类中的函数

二动态多态:即动态绑定,在运行时才去确定对象类型和正确选择需要调用的函数,一般用于解决基类指针或引用派生类对象调用类中重写的方法(函数)时出现的问题

测试代码:

#include <iostream>using namespace std;class AA
{public:AA(){cout << "AA()的构造函数"<<endl;}~AA(){cout << "AA()的析构函数"<<endl;}void show(){cout << "我是show1" << endl;}
};class BB :public AA
{public:BB(){cout << "BB()的构造函数"<<endl; }~BB(){cout << "BB()的析构函数"<<endl; }void show(){cout << "我是show2" << endl;}
};int main()
{//使用指针时在析构时只会调用基类中地析构函数//AA * d = new BB();//d->show();    BB a;AA &b = a;b.show();//delete d; //使用指针时用于释放内存return 0;
}

运行结果:
(1)引用

(2)指针:

很明显该程序执行的结果并没有按照AA类型的指针指向的真正的内容去执行对应的代码,而我们是想要编译器能够正确地知道AA &b(或指针)所指向地内容是什么类型的而不是根据当前指针或引用的类型去判断调用什么函数,此时我们实现这种动态多态就需要通过使用关键字virtual来实现;

(1)virtual 修饰的函数称为虚函数,其是通过使用virtual关键字后产生一个虚表(虚函数表),然后每一个对象会创建一个虚表,虚表存放当前对象拥有的虚函数
(2)当虚函数被创建后就会被放入虚表,当派生类重写虚函数后,创建派生类对象时会把虚表内的对应函数地址换成派生类中重写的函数地址

注意:
(1)每次执行虚函数都会去重新去替换掉原来虚表的位置
(2)当使用虚函数后原来函数的存放位置会分配一个指针用于指向虚表中函数的地址
(3)一个对象可以拥有多个虚函数,但只能有一个虚表

测试代码:

#include <iostream>using namespace std;class AA
{public:AA(){cout << "AA()的构造函数"<<endl;}   ~AA(){cout << "AA()的析构函数"<<endl;}   virtual void show(){cout << "我是show1" << endl;}
};class BB :public AA
{public:BB(){cout << "BB()的构造函数"<<endl;}~BB(){cout << "BB()的析构函数"<<endl;}void show(){cout << "我是show2" << endl;}
};int main()
{BB a;AA &b = a;b.show();return 0;
}

运行结果:


关于虚表地址:

此时就会根据对象去正确地选择函数调用了

《纯粹个人理解,有错的地方麻烦提醒一下;非常感谢》

动态多态和静态多态(C++)相关推荐

  1. C++知识点 多态、静态多态、动态多态

    多态 有了继承才有多态的概念,首先说一下继承. 继承的概念是派生类可以调用基类的成员.常举的例子,动物是基类,它拥有所有动物共有的一些特征和方法.它会衍生出猫的类,狗的类,派生出的类除了有动物公共的特 ...

  2. c++中的多态---1(多态概念,静态联编和动态联编,多态原理解析,重载,重写,重定义的对比)

    多态的基本概念 多态是面向对象设计语言数据抽象和继承之外的第三个基本特征 多态性(polymorphism)提供接口与具体实现之间的另一层隔膜,从而将"what"和"ho ...

  3. C++多态——静态多态与动态多态

    多态 : 顾名思义,多态就是多种形态,也就是对不同对象发送同一个消息,不同对象会做出不同的响应. 并且多态分为静态多态和动态多态. 静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数, ...

  4. C++编译时多态和运行时多态

    C++编译时多态和运行时多态 作者:melonstreet 出处:https://www.cnblogs.com/QG-whz/p/5132745.html 本文版权归作者和博客园共有,欢迎转载,但未 ...

  5. 【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )

    文章目录 类的继承 方法的重写 子类中调用父类方法 多态 虚函数 虚函数示例 纯虚函数 相关代码 类的继承 1. 继承表示 : C++ 中继承可以使用 ":" 符号 , 格式为 & ...

  6. C++静态多态与动态多态

    静态多态(编译期/早绑定) 函数重载 class A {public:void do(int a);void do(int a, int b); }; 动态多态(运行期期/晚绑定) •虚函数:用 vi ...

  7. C++_类和对象_C++多态_多态的基本语法_静态多态_动态多态_虚函数---C++语言工作笔记069

    然后我们再来看看C++中的多态,这里还要注意一点,就是在C++中是可以用多继承的, 但是java.不行,只能实现多个接口,不能继承多个类.这让c++会更加灵活一点. 可以看到,上面说了,在c++中,分 ...

  8. [转载] 【Python进阶】4-2 多态 | 什么是多态 / 静态语言vs动态语言 / python中多态

    参考链接: Python中的多态 文章目录 1.什么是多态"开闭"原则 2.静态语言 vs 动态语言小结 3.python中多态 1.什么是多态 要理解什么是多态,我们首先要对数据 ...

  9. Java静态多态和动态多态

    方法解析 Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址.这个特性给Java带来了更强大的动态扩 ...

最新文章

  1. 如何在Terminal命令行模式下运行Objective-C
  2. CodeForces - 1486C2 Guessing the Greatest (hard version)(二分+交互)
  3. 实用常识_实用垃圾收集,第1部分–简介
  4. Flume实战监听网络端口
  5. 给文件夹中的文件批量更改名称
  6. 南京师范大学地图学与地理信息系统专业《地理信息系统原理》研究生(硕士)期末试卷
  7. 愿你与生活交手多年,依然满怀新鲜,
  8. 元宇宙系统全面学习线路
  9. NC 一些常用方法总结
  10. inflate的使用
  11. eclipse打开报错
  12. 重大要素改变中的机会选择包括_智慧树青年教师课堂教学比赛微课4答案
  13. [转]老(道)孔(儒)轮流做庄
  14. 前端之Html+Css实现动画的方法
  15. 计算机组成原理分部实验,计算机组成原理实验指导书.doc
  16. iPhone 快捷指令 切换4G、5G
  17. Python判断奇偶的方法
  18. 贴片采样电阻的那点事
  19. HTML教程Hello World
  20. 短短两个月 Snapchat下载量下跌了22%

热门文章

  1. uni-app 利用canvas画简单海报并保存图片
  2. 转:解决模拟器安装 timeout的问题
  3. 基于android2.3.5系统:开天辟地Android启动机制[一]
  4. 在如何提高产品的页面和宝贝转化率上
  5. 狼性创业:普通人创业失败最核心的根源是什么?
  6. 移动应用表单设计秘籍
  7. phpm mysql渗透猜_Web渗透 之 PHP 与MySQL 交互
  8. PHP+MySql+Bootstrap实现用户界面数据的删除、修改与批量选择删除——实例操作
  9. (C语言)练习3——压岁钱
  10. 讲真的,你与大厂只差这篇面经!教你如何通过蚂蚁面试、成功转正和升职加薪!