多态基本语法和原理
发布日期:2021-11-20 10:17:50 浏览次数:10 分类:技术文章

本文共 1772 字,大约阅读时间需要 5 分钟。

多态(多种形态)是C++面向对象的三大特性之一

多态分为两类:

1.静态多态:函数重载和运算符重载属于静态多态,复用函数名
2.动态多态:派生类和虚函数实现运行时多态
(重点)

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

1.静态多态的函数地址早绑定—编译阶段确定函数地址

2.动态多态函数地址晚绑定—运行阶段确定函数地址
3.父类的指针或引用指向子类,满足子类实现虚函数的功能
动态多态满足条件:
1.有继承关系
2.子类要重写父类的虚函数

重写:即函数返回值类型 函数名 参数列表 完全相同

//动态多态的使用

父类的指针或者引用,指向子类对象

*/

#include "pch.h"#include 
using namespace std;class animal {
public: virtual void speak() {
cout<<"动物在说话" << endl; }};class cat :public animal {
public: //重写:即函数返回值类型 函数名 参数列表 完全相同 void speak() {
cout << "小猫在说话" << endl; }};class dog :public animal {
public: void speak() {
cout << "小狗在说话" << endl; }};//执行说话的函数//函数地址早绑定-- - 编译阶段确定函数地址//如果想执行让猫说话,那么这个函数地址就不能提前绑定,需要在运行阶段进行绑定,地址晚绑定void dospeak(animal &animal) {
//animal &animal=cat; //动态多态的使用 //父类的指针或者引用,指向子类对象 animal.speak();}void test01() {
cat cat; dospeak(cat);}int main(){
test01();}

多态原理

在这里插入图片描述

1.多态让您能够将派生类对象视为基类对象,例如:假设你创建了从Mammal派生出的Dog, Cat,Horse类,而Mammal类包含很多适用于这些派生类的成员函数,而其中speak(),就是其中之一。它实现了所有哺乳动物都能发出声音的功能。但是现在我们想让每个派生类都发出特殊的声音:如犬吠,猫叫等。每个派生类都必须能够重写speak()方法的实现。
与此同时,如果有一系列Mammal对象,如有Dog,Cat,Horse,Cow对象的农场,你希望让这些对象发出声音,而无需知道或关心它们的speak()实现。将这些对象都视为哺乳动物而调用方法Mammal.speak()时,便使用了多态。

#include
class Mammal{
public: Mammal():age(1){
} ~Mammal(){
} virtual void speak() const{
std::cout<<"Mammal speak!"<
>choice; switch (choice) {
case 1: ptr=new Dog; break; case 2: ptr=new Cat; break; case 3: ptr=new Horse; break; case 4: ptr=new Pig; break; default: ptr=new Mammal; break; } array[i]=ptr; } for (int i = 0; i < 5; i++) {
array[i]->speak(); } system("pause"); return 0;}

在编译阶段,无法知道将创建什么类型的对象,因此无法知道将调用哪个speak()方法。ptr指向的对象是在运行阶段确定的,这被称为后期绑定(晚绑定)或运行阶段绑定,与此相对的是静态绑定(早期绑定)或编译阶段绑定。

转载地址:https://blog.csdn.net/weixin_43223362/article/details/102887295 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:多态-纯虚函数和抽象类
下一篇:继承-4构造和析构顺序

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月08日 11时04分10秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

ES6-ES11新特性_ECMAScript相关名词介绍_---JavaScript_ECMAScript工作笔记002 2019-04-26
ES6新特性_let变量声明以及声明特性---JavaScript_ECMAScript_ES6-ES11新特性工作笔记003 2019-04-26
Sharding-Sphere,Sharding-JDBC_介绍_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记001 2019-04-26
Sharding-Sphere,Sharding-JDBC_分库分表介绍_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记002 2019-04-26
C++_类和对象_对象特性_构造函数的分类以及调用---C++语言工作笔记041 2019-04-26
C++_类和对象_对象特性_拷贝构造函数调用时机---C++语言工作笔记042 2019-04-26
C++_类和对象_对象特性_构造函数调用规则---C++语言工作笔记043 2019-04-26
C++_类和对象_对象特性_深拷贝与浅拷贝---C++语言工作笔记044 2019-04-26
AndroidStudio_java.util.ConcurrentModificationException---Android原生开发工作笔记237 2019-04-26
AndroidStudio_android中实现对properties文件的读写操作_不把properties文件放在assets文件夹中_支持读写---Android原生开发工作笔记238 2019-04-26
弹框没反应使用Looper解决_the caller should invoke Looper.prepare() and Looper.loop()---Android原生开发工作笔记239 2019-04-26
Command line is too long. Shorten command line for Application---微服务升级_SpringCloud Alibaba工作笔记0067 2019-04-26
AndroidStudio_android实现双击_3击_监听实现---Android原生开发工作笔记240 2019-04-26
C++_类和对象_对象特性_初始化列表---C++语言工作笔记045 2019-04-26
AndroidStudio安卓原生开发_UI高级_DrawerLayout_侧滑菜单控件---Android原生开发工作笔记120 2019-04-26
AndroidStudio安卓原生开发_UI高级_Shape的使用_虚线_直线_矩形_渐变_径向渐变_线性渐变_扫描渐变---Android原生开发工作笔记122 2019-04-26
AndroidStudio安卓原生开发_UI高级_StateListDrawable状态选择器_按钮按下和抬起显示不同颜色---Android原生开发工作笔记124 2019-04-26
kivy制作安卓APP--简单音乐播放器 2019-04-26
安卓开发入门教程-Activity 2019-04-26
Angular2工程部署到Tomcat服务器,第一次访问正常,刷新浏览器后报404错误 2019-04-26