C++ 多态三

news2024/11/15 12:37:50

1.多态的概念

多态的前提的是继承。当不同的对象去完成同一种行为时会产生不同的结果就是多态的通俗意义。

例如学生、成人两个对象去完成买票这个行为,那么学生的结果是获得半价,而成人获得的结果的是全价。

2.多态的定义及实现

2.1构成多态的两个硬性条件

调用的函数必须是虚函数,且派生类必须对虚函数重写;必须是基类的引用或指针调用虚函数。

虚函数就是在成员函数之前加一virtual关键字。虚函数的目的就是为了实现多态

下面的程序是一个多态的案例:
class Person
{
public:
    virtual void print()
    {
        cout << "Person::全价" << endl;
    }
};
 
class Student : public Person
{
public:
    virtual void print()
    {
        cout << "Student::半价" << endl;
    }
};
 
void test(Person* ptr)    //传入的对象不同调用不同的虚函数
{
    ptr->print();    //必须是基类的指针或引用调用虚函数
}
int main()
{
    Student s;
    Person p;
 
    test(&p);
    test(&s);
    
    return 0;
}

2.2虚函数的重写

派生类中有一个与基类完全相同的虚函数(返回值、函数名、参数),但是定义是派生类想要的,这样的,称派生类完成了对基类虚函数的重写(覆盖)。
派生类的重写虚函数不一定非要加virtual关键字,因为基类被继承之后其虚函数依旧保持其原有的虚函数属性,但是这样的代码风格是不规范的。

3.抽象类

在虚函数的后面写上 =0 ,则这个函数为纯虚函数包含纯虚函数的类叫做抽象类也叫接口
),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生
类才能实例化出对象。纯虚函数规范了派生类必须重写另外纯虚函数更体现出了接口继承。

class Car
{
public:
    virtual void Drive() = 0;
};
 
class Benz :public Car
{
public:
};
 
int main()
{
    Benz b;    //错误,Benz类没有完成基类纯虚函数的重写
    return 0;
}

3.1接口继承和实现继承


普通成员函数的继承是一种实现继承,派生类继承了基类普通成员函数的所有东西(返回值、函数名、参数列表、函数定义)。虚函数的继承是一种接口继承,派生类只继承了基类虚函数的接口(返回值、函数名、参数列表),其目的就是为了派生类能够对虚函数进行重写(即使没有对基类虚函数进行重写,派生类依然保持基类原有虚函数,这是特性)。

下面是一道练习题:
// 下面程序输出结果是什么?
class A
{
public:
    virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
    virtual void test() { func(); }
};
class B : public A
{
public:
    void func(int val = 0) { std::cout << "B->" << val << std::endl; }
};
int main(int argc, char* argv[])
{
    B* p = new B;
    p->test();
    return 0;
}
// A: A->0 B : B->1 C : A->1 D : B->0 E : 编译出错 F : 以上都不正确

解析:使用派生类指针p指向派生类对象,那么这是一次普通函数调用。调用的函数是基类继承到派生类的虚函数,但是派生类没有对此函数完成重写,所以调用func函数时的this指针是基类指针,是一次多态调用。这个基类指针指向的是派生类对象(外部new了一个派生类对象),所以调用的是派生类重写之后的func函数,又因为接口继承,所以派生类的func函数的参数的缺省值为1,所以最终结果为B->1。

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

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

相关文章

自闭症学校排名前十,揭秘顶级干预学校

在当今社会&#xff0c;自闭症儿童的数量不断上升&#xff0c;众多家庭都在全力以赴地为孩子寻找适宜的自闭症学校。当面临这一重要抉择时&#xff0c;家长们常常首先想到的便是查看自闭症学校排名前十的榜单。然而&#xff0c;网络上此类排名繁多&#xff0c;其真实性与可靠性…

国产光耦的工作原理、优势以及应用介绍

国产光耦作为一种关键的电子元件&#xff0c;因其卓越的光隔离特性&#xff0c;被广泛应用于电气隔离和信号隔离领域。其可靠的性能使其在电源管理、数据通信和音频处理等领域发挥重要作用。 国产光耦是由发光二极管&#xff08;LED&#xff09;和光敏器件&#xff08;如光敏晶…

查理三世的假期并不理想 对泰勒·斯威夫特主题舞会引发的骚乱未采取其他行动遭各方批评

当查理三世国王在苏格兰巴尔莫勒尔堡享受一年一度的夏日假期时&#xff0c;英国其他地区却在应对由 7 月 29 日泰勒斯威夫特主题舞会上持刀袭击而引发的骚乱。王室成员在宫殿高墙内休息&#xff0c;而暴力事件却不断增多&#xff0c;这种对比让许多原本忠实的粉丝感到不安。 由…

C# 在Word中插入或删除分节符

在Word中&#xff0c;分节符是一种强大的工具&#xff0c;用于将文档分成不同的部分&#xff0c;每个部分可以有独立的页面设置&#xff0c;如页边距、纸张方向、页眉和页脚等。正确使用分节符可以极大地提升文档的组织性和专业性&#xff0c;特别是在长文档中&#xff0c;需要…

BCrypt加密算法的使用及原理

系列文章目录 1.SpringBoot整合RabbitMQ并实现消息发送与接收 2. 解析JSON格式参数 & 修改对象的key 3. VUE整合Echarts实现简单的数据可视化 4. List&#xff1c;HashMap&#xff1c;String,String&#xff1e;&#xff1e;实现自定义字符串排序&#xff08;key排序、Val…

69、zabbix自动、代理、snmp监控

一、zabbix 1.1、自动发现 [roottest1 ~]# systemctl stop firewalld [roottest1 ~]# setenforce 0 [roottest3 ~]# vim /etc/hosts 192.168.168.21 test1 192.168.168.23 test3 [roottest1 ~]# vim /etc/hosts 192.168.168.21 test1 192.168.168.23 test3 ------------…

AI智能名片B2B2C商城系统:优化三度空间渠道布局与避免渠道冲突的新策略

摘要&#xff1a;在数字化浪潮的推动下&#xff0c;品牌商面临着前所未有的市场挑战与机遇。为了应对这些挑战并抓住机遇&#xff0c;品牌商需要构建并优化一个高效、协同的三度空间&#xff08;线下实体店、线上电商平台、数字营销渠道&#xff09;渠道布局。本文深入探讨了AI…

【多线程-从零开始-玖】内核态,用户态,线程池的参数、使用方法详解

文章目录 1. 为什么会有线程池2. 内核态和用户态2.1 场景构造 3. 标准库的线程池3.1 构造方法的参数3.1.1 核心线程数和最大线程数3.1.2 非核心线程允许摸鱼的最大时间3.1.3 工作队列&#xff08;阻塞队列&#xff09;3.1.4 线程工厂工厂设计模式 3.1.5 拒绝策略四种拒绝策略 3…

极投影ax.contourf

我想用极投影画个类似下面这样的效果图&#xff0c;首先底图是一个这样的&#xff0c;然后再有需要的地方做标记&#xff0c;比如斜线和渔网状的东西。 但是我怎么尝试都是得到了一个下面这样的图这样肯定有问题 我调整为画轮廓线之后变成下面这样的图&#xff0c;我猜想应该是…

Python酷库之旅-第三方库Pandas(073)

目录 一、用法精讲 296、pandas.Series.dt.as_unit方法 296-1、语法 296-2、参数 296-3、功能 296-4、返回值 296-5、说明 296-6、用法 296-6-1、数据准备 296-6-2、代码示例 296-6-3、结果输出 297、pandas.Series.dt.days属性 297-1、语法 297-2、参数 297-3、…

Ansys Mechanical|解决温度场-电场耦合问题

一.多物理场耦合分析的必要性 你是否曾经碰到过你的模型受到两个或者更多物理因素影响的情况吗&#xff1f;这些物理因素不仅会相互影响&#xff0c;还会影响计算结果。 这时多物理场分析就有用了。在解决多物理场影响的工程问题时&#xff0c;多物理场耦合分析是必要的。 举…

IO进程----标准IO

目录 IO进程 标准IO 1. 概念&#xff1a; 2. 特点&#xff1a; 3. 缓存区 3.1. 行缓存&#xff1a;和终端操作相关 刷新缓存的条件&#xff1a; 1) 程序正常退出 2) \n刷新 3) 缓存区满刷新 4) 强制刷新 fflush 3.2. 全缓存&#xff1a;和文件操作相关 3.…

【C++】模版详解

1、概念 C模版分两类&#xff1a;函数模版和类模版 1&#xff09;函数模板的格式 template <class 形参名&#xff0c;class 形参名&#xff0c;......> 返回类型 函数名(参数列表) {函数体 }例如&#xff1a; template <class T> void swap(T& a, T& b…

android13 关闭selinux 临时关闭或者永久关闭

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况分析 2.1 临时关闭 2.2 永久关闭 3.修改方法 3.1 临时修改 3.2 永久关闭 4.编译测试 5.彩蛋 1.前言 在Android操作系统中,SELinux(Security-Enhanced Linux)是一种安全模块,用于提供强制访问控制(MAC)安全…

为什么不用postman做自动化

面试的时候被问到&#xff1a;为什么不用postman做自动化 打开postman&#xff0c;看到用例集管理、API 管理、环境管理这三个功能&#xff0c;用户体验感算得上品牌等级了 为什么不用呢&#xff0c;文心一言给了一些答案 不适合大规模自动化测试&#xff1a;Postman 主要是为…

AI大模型排行榜(gpt-4o-2024-08-06)

https://github.com/yuchenlin/ZeroEval/blob/main/result_dirs/mmlu-redux.summary.md 人工智能学习网站 https://chat.xutongbao.top

学习日志8.8--防火墙精细化策略管控

本次实验的拓扑结构&#xff0c;用PC2去模拟和外部网络连接的Internet。 在trust和untrust区域上&#xff0c;希望将防火墙安全策略的默认动作修改为deny&#xff0c;然后精细化控制流量的访问&#xff0c;从trust到untrust控制只允许192.168.1.0的网络通过&#xff0c;从untr…

Spring Boot 3.x Filter实战:记录请求日志

上一篇&#xff1a;Spring Boot 3.x Web单元测试最佳实践 前面我们在《Spring Boot 3.x Rest API最佳实践之统一响应结构》中学习响应的统一拦截处理&#xff0c;顺带完成了响应结果的记录&#xff1b;而对于请求内容咱们也必须进行日志记录&#xff0c;以确保排查问题时有据可…

又一苹果经典产品宣布停产,老用户满满的回忆

苹果公司的SuperDrive&#xff0c;作为一项曾经引领潮流的外置光驱技术&#xff0c;自2008年伴随着革命性的MacBook Air轻盈登场以来&#xff0c;便成为了苹果电脑产品线中一道亮丽的风景线&#xff0c;象征着科技与美学的完美结合。 这款光驱以其超薄的设计、高效的读写速度以…

leetcode787. K 站中转内最便宜的航班——优先队列优化的Dijkstra算法+剪枝

题目 leetcode787. K 站中转内最便宜的航班 题目分析 给定一个城市图&#xff0c;每个城市通过航班与其他城市相连。每个航班都有一个起点、终点和价格。你需要找到从起点城市 src 到终点城市 dst 的最便宜路径&#xff0c;但这条路径最多只能经过 k 个中转站。你需要返回这…