49 - 多态的概念和意义

news2025/7/19 10:14:33

---- 整理自狄泰软件唐佐林老师课程

1. 函数重写回顾

  • 父类中被重写的函数依然会继承给子类
  • 子类中重写的函数将覆盖父类中的函数
  • 通过作用域分辨符(::)可以访问父类中的函数

在这里插入图片描述
p->print()不符合预期,期望调用子类中的print,实际调用父类的print

2. 多态的概念和意义

  • 面向对象中期望的行为:
    • 根据 实际的对象类型 判断如何调用重写函数
    • 父类指针/引用指向父类对象则调用父类对象中定义的函数
    • 父类指针/引用指向子类对象则调用子类中定义的重写函数

在这里插入图片描述

2.1 面向对象中的多态的概念

  • 根据 实际的对象类型 决定函数调用的具体目标
  • 同样的调用语句在实际运行时有多种不同的表现形式
    在这里插入图片描述

2.2 C++语言直接支持 多态 的概念

通过使用 virtual关键字 对多态进行支持

被virtual声明的函数被重写后具有多态 特性

被virtual声明的函数叫做 虚函数

  • 编程实验:多态的初体验
#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    virtual void print()
    {
        cout << "I'm Parent." << endl;
    }
};

class Child : public Parent
{
public:
    void print()
    {
        cout << "I'm Child." << endl;
    }
};

void how_to_print(Parent* p)
{
    p->print();     // 展现多态的行为
}

int main()
{
    Parent p;
    Child c;
    
    how_to_print(&p);    // Expected to print: I'm Parent.
    how_to_print(&c);    // Expected to print: I'm Child.
    
    return 0;
}

在这里插入图片描述

2.3 多态的意义

  • 在程序运行过程中展现出多态的特性
  • 函数重写必须多态实现,否则没有意义
  • 多态是面向对象组件化程序设计的基础特性

2.4 理论中的概念

  • 静态联编

    • 在程序的 编译期间 就能确定 具体的函数调用
      如:函数重载
  • 动态联编

    • 在程序 实际运行后 才能确定 具体的函数调用
      如:函数重写
  • 实例分析:动态联编和静态联编

#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    virtual void func()
    {
        cout << "void func()" << endl;
    }
    
    virtual void func(int i)
    {
        cout << "void func(int i) : " << i << endl;
    }
    
    virtual void func(int i, int j)
    {
        cout << "void func(int i, int j) : " << "(" << i << ", " << j << ")" << endl;
    }
};

class Child : public Parent
{
public:
    void func(int i, int j)
    {
        cout << "void func(int i, int j) : " << i + j << endl;
    }
    
    void func(int i, int j, int k)
    {
        cout << "void func(int i, int j, int k) : " << i + j + k << endl;
    }
};

void run(Parent* p)
{
    p->func(1, 2);     // 展现多态的特性
                       // 动态联编
}


int main()
{
    Parent p;
    
    p.func();         // 静态联编
    p.func(1);        // 静态联编
    p.func(1, 2);     // 静态联编
    
    cout << endl;
    
    Child c;
    
    c.func(1, 2);     // 静态联编
    
    cout << endl;
    
    run(&p);
    run(&c);
    
    return 0;
}

在这里插入图片描述

2.5 编程实验

#include <iostream>
#include <string>

using namespace std;

class Boss
{
public:
    int fight()
    {
        int ret = 10;
        
        cout << "Boss::fight() : " << ret << endl;
        
        return ret;
    }
};

class Master
{
public:
    virtual int eightSwordKill()
    {
        int ret = 8;
        
        cout << "Master::eightSwordKill() : " << ret << endl;
        
        return ret;
    }
};

class NewMaster : public Master
{
public:
    int eightSwordKill()
    {
        int ret = Master::eightSwordKill() * 2;
        
        cout << "NewMaster::eightSwordKill() : " << ret << endl;
        
        return ret;
    }
};

void field_pk(Master* master, Boss* boss)
{
    int k = master->eightSwordKill();
    int b = boss->fight();
    
    if( k < b )
    {
        cout << "Master is killed..." << endl;
    }
    else
    {
        cout << "Boss is killed..." << endl;
    }
}

int main()
{
    Master master;
    Boss boss;
    
    cout << "Master vs Boss" << endl;
    
    field_pk(&master, &boss);
    
    cout << "NewMaster vs Boss" << endl;
    
    NewMaster newMaster;
    
    field_pk(&newMaster, &boss);
    
    return 0;
}

在这里插入图片描述

3. 小结

  • 函数重写只可能发生在父类和子类之间
  • 根据 实际对象的类型 确定调用的具体函数
  • virtual关键字是C++中支持多态的唯一方式
  • 被重写的虚函数可表现为 多态 的特性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/36462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【知识网络分析】研究者合作网络(co-investigator)

研究者合作网络(co-investigator) 1 数据集读取2 网络数据集精简3 网络最大子群获取并可视化4 社团群体分类筛选5 求解网络图中节点中心度相关的指标值并进行可视化1 数据集读取 此处的合作作者(co-investigator)是指基金数据中的作者,数据集 来自于官网提供的加拿大国家…

redis数据库windows下c语言库的编译

使用cmake和make工具进行windows下的编译 下载 1.hiredis下载地址 https://github.com/redis/hiredis 克隆源码 2.cmake下载地址 https://cmake.org/ 3.make for windows http://www.equation.com/servlet/equation.cmd?fa=make 4.mingw 64位 https://download.csdn.net/d…

USB Network Native Driver for ESXi更新支持ESXi8.0

在ESXi8.0发布一个多月后&#xff0c;社区版的USB网卡驱动终于在flings上更新了&#xff0c;USB Network Native Driver for ESXi | VMware Flings Nov 23, 2022 - v1.11 Added support for ESXi 8.0 ESXi800-VMKUSB-NIC-FLING-61054763-component-20826251.zip md…

如何根据不同需求给Word文档设置保护?

Word文档可以设置不同的保护模式&#xff0c;我们可以根据不同需求选择合适的方法&#xff0c;下面介绍一下常用的3种方法。 方法一&#xff1a; 如果不想Word文档被随意打开&#xff0c;我们可以设置打开密码&#xff0c;只有输入正确的密码才能打开文件。 首先&#xff0c…

Metabase学习教程:视图-4

将数据可视化为直方图 学习何时使用直方图&#xff0c;以及元数据库如何使创建直方图更容易。 我们将逐步创建直方图&#xff0c;它是一种条形图&#xff0c;显示连续范围内的数据组。柱状图有助于深入了解人们可能购买的商品的数量、他们可能购买的价格范围&#xff0c;甚至…

JS 数据结构:集合

集合 集合是由一组无序且唯一&#xff08;即不能重复&#xff09;的项组成的。该数据结构使用了与有限集合相同的数学概念。ES6 JS 原生实现了集合 Set 数据结构&#xff08;具体看这篇文章JS Set 与 weakSet&#xff09;&#xff0c;但是没有取两集合交集、并集、差集的 API …

机器学习笔记之高斯网络(二)高斯贝叶斯网络

机器学习笔记之高斯网络——高斯贝叶斯网络引言回顾高斯网络贝叶斯网络&#xff1a;因子分解高斯贝叶斯网络&#xff1a;因子分解引言 上一节介绍了高斯网络及其条件独立性&#xff0c;本节将介绍高斯贝叶斯网络。 回顾 高斯网络 高斯网络最核心的特点是&#xff1a;随机变…

SpringBoot 多点互斥登录(web应用安全) 保姆级教程

1.什么是互斥登录 在实际生活中&#xff0c;很多网站都做了多点登录互斥的操作&#xff0c;简单来说就是同一个账号&#xff0c;只能在一台电脑上登录&#xff0c;如果有人在其他地方登录&#xff0c;那么原来登录的地方就会自动下线&#xff0c;再进行操作就会弹出登录界面。 …

【远程调用 MySQL数据库并操作】——使用NATAPP搭建内网穿透远程访问MySQL数据库并使用 Python新建、写入、读取、删除数据【详细版】

所有的程序都是免费的&#xff01;&#xff01; Python MySQL NATAPP 点个赞留个关注吧&#xff01;&#xff01; NATAPP 安装使用教程 官网 NATAPP 下载 官网 NATAPP配置教程 1、进入NATAPP 登录/注册 进行登录&#xff0c;没有的注册一下&#xff0c;需要实名认证哦&am…

python基础之字符串

文章目录一、字符串定义二、字符串相关使用三、空白字符表示哪些&#xff1f;四、实例1.要求&#xff1a;顺序并且居中对齐输出以下内容2.要求&#xff1a;1.将字符串中的空白字符全部删去&#xff1b;2.再使用“ ”作为分隔符&#xff0c;拼接成一个整齐的字符串五、字符串的切…

【vscode】远程云主机的报错

win11 之前在另一台电脑上的vscode是可以的 新电脑拷贝了vs的配置&#xff0c;但是远程不行了。 Install terminal quit with output: 过程试图写入的管道不存在。 发现连接不到远程以为是konw hosts 的问题&#xff0c; 删除了要访问ip的内容&#xff0c;还是不行&#x…

网络程序设计——异步选择模型(基于消息的选择、基于事件的选择)

目录 一、异步选择模型 1、基于消息的选择模型 &#xff08;1&#xff09;WSAAsyncSelect模型 &#xff08;2&#xff09; WSAAsyncSelect()函数 &#xff08;3&#xff09;使用 WSAAsyncSelect模型接收数据的过程 &#xff08;4&#xff09;WSAAsyncSelect模型的编程方法…

IDEA常用插件

笔记来源于B站视频 以下为视频的地址 【【尚硅谷】IDEA2022全新版教程&#xff0c;兼容JDK17&#xff08;快速上手Java开发利器&#xff09;】https://www.bilibili.com/video/BV1CK411d7aA?p26&vd_source581d732b20cb23e01428068f153a99ed 推荐1&#xff1a;Alibaba J…

MCE丨重组蛋白常见的融合标签

Q&#xff1a;什么是融合标签&#xff1f; A&#xff1a;融合标签是指利用 DNA 体外重组技术&#xff0c;在目的蛋白 N 端或 C 端进行融合表达的特定蛋白、多肽或寡肽标签。 Q&#xff1a;融合标签有什么作用&#xff1f; A&#xff1a;重组蛋白通过融合标签与包被在固相基质上…

第六章《类的高级特性》第5节:接口

在Java语言中,一个类只能继承一个父类,专业上把这种继承机制称为“单继承”。单继承是一种较为稳妥继承机制,能够规避很多潜在的问题,但这种继承机制的局限性也显而易见:子类不能从多个父类中继承属性和方法,从而无法最大程度的减少重复劳动。为了弥补这个缺陷,Java语言…

web前端-javascript-关系运算符(>、>=、<、<=、非数值,Unicode 编码说明)

文章目录关系运算符1. 说明2. > 大于号3. > 大于等于4. < 小于号5. < 小于等于6. 非数值的情况6.1. 对于非数值进行比较时&#xff0c;会将其转换为数字然后再比较6.2. 如果符号两端都是字符串时&#xff0c;不会将其转换为字符串进行比较6.3. 任何值和 NaN 做任何…

为什么单线程的Redis如此的快(Why is single-threaded Redis so fast)

视频地址&#xff1a;YouTube Why is Redis so fast? What fundamental design decisions did the developers make more than a decade ago that stood to test of time. Let’s take a look. Redis is a very popular in-memory database. It’s rock solid, easy to use, a…

HittER: Hierarchical Transformers for Knowledge Graph Embeddings

HittER: Hierarchical Transformers for Knowledge Graph Embeddings HittER由两部分组成&#xff1a; 1&#xff0c;底部&#xff1a;Entity Transformer 源实体的局部邻居的每个实体-关系对的特征提取。负责将实体关系对中所有有用特征打包成向量&#xff0c;以供顶部块使用…

mysql基础部分第一次复习(1-8章,到聚合函数)

基本的使用 show databases; create database 数据库名; //创建数据库 use 数据库名&#xff1b; //使用数据库 使用完use语句之后接下来的SQL操作都是针对当前数据库的了show tables; //查看某个数据库的所有表格 show tables from 数据库名&#xff1b;create table 表名称{…

C++--智能指针--1123

1.智能指针解决的问题 int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument("除0错误");return a / b; } void Func() { // 1、如果p1这里new 抛异常会导致p1不会Delete而导致内存泄漏 // 2、如果p2这里new 抛异常会导致p1和p2都不会de…