C++:多态

news2024/12/19 22:41:45

文章目录

  • 一、多态的概念
  • 二、多态的定义及实现
    • 2.1 多态的构成条件
    • 2.2 虚函数
    • 2.3 虚函数的重写(覆盖)
    • 2.4 override 和 final
    • 2.5 重载、覆盖(重写)、隐藏(重定义)的对比
  • 三、抽象类
  • 四、继承和多态常见的面试问题
    • 1.
    • 2.
  • 总结


一、多态的概念

  多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。
  比方说,我们现在邀请一个朋友Pony玩《金铲铲之战》,登陆游戏后,由于Pony是新用户,而我是老用户,游戏会根据用户的类型来显示不同的页面

二、多态的定义及实现

2.1 多态的构成条件

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。
比如Student继承了Person。
Person对象买票全价,Student对象买票半价。
那么在继承中要构成多态还有两个条件

  1. 必须通过基类的指针或者引用调用虚函数
  2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写

在这里插入图片描述

2.2 虚函数

  虚函数:即被virtual修饰的类成员函数称为虚函数。

2.3 虚函数的重写(覆盖)

  派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的
返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。
  如上图中Person的BuyTicket和Student的BuyTicket函数。

2.4 override 和 final

  1. override: 检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错
  2. final:修饰虚函数,表示该虚函数不能再被重写
    使用实例如下:
class Car {
public:
	virtual void Drive() {}
};
class Benz :public Car {
public:
	virtual void Drive() override { cout << "Benz-舒适" << endl; }
};
class Car
{
public:
virtual void Drive() final {}
};
class Benz :public Car
{
public:
virtual void Drive() {cout << "Benz-舒适" << endl;}
};

2.5 重载、覆盖(重写)、隐藏(重定义)的对比

在这里插入图片描述

三、抽象类

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

class Car
{
public:
	virtual void Drive() = 0;//纯虚函数
};
class Benz :public Car
{
public:
	virtual void Drive()//重写
	{
		cout << "Benz-舒适" << endl;
	}
};
class BMW :public Car
{
public:
	virtual void Drive()//重写
	{
		cout << "BMW-操控" << endl;
	}
};
void Test()
{
	Car* pBenz = new Benz;
	pBenz->Drive();
	Car* pBMW = new BMW;
	pBMW->Drive();
}

四、继承和多态常见的面试问题

感觉能力不够,不能讲的很细致,我们来看几个题目吧。

1.

下面 C++ 程序的运行结果是()

#include <iostream>
using namespace std;
class parent {
	int i;
protected:
	int x;
public:
	parent() { x = 0; i = 0; }
void change() { x++; i++; }
void display();
};
class son :public parent {
public:
void modify();
};
void parent::display() {
	cout << "x=" << x << endl;
}
void son::modify() {
	x++;
}
int main() {
	son A;
	parent B;

	A.display();			
	A.change();
	A.modify();
	A.display();
	B.change();
	B.display();
	return 0;
}

A x=1      B x=2
 x=0       x=0
 x=2       x=1

C x=0       D x=0
 x=2       x=1
 x=1       x=2

题解:注意看,首先实例化两个对象A,B.
调用了display函数,由于子类中没有这个函数,
我们前往父类执行,打印x= ,由于构造子类,首先要构造父类,父类中初始化x为0,因此打印x=0.
接着调用change函数,同样的,子类中没有这个函数,
继续前往父类执行,x++,i++,x的值变为1,i的值变为1
然后是modify函数,x变为2,
再次调用display,打印x=2.
注意看下一行,由于我们上面已经修改的x是A空间的x,与B空间无关,
因此B空间的x还是要从0开始,
执行change函数,x变为1,最后打印x=1,也就是选择C

2.

分析一下这段程序的输出

#include<iostream>
using namespace std;
class B
{
public:
	B()
{
	cout << "default constructor" << " ";
}
~B()
{
	cout << "destructed" << " ";
}
B(int i): data(i)
{
	cout << "constructed by parameter" << data << " ";
}
private: 
	int data;
};
B Play( B b)
{
	return b;
}
int main(int argc, char *argv[])
{
	B temp = Play(5);
	return 0;
}

A constructed by parameter5 destructed destructed
B constructed by parameter5 destructed
C default constructor" constructed by parameter5 destructed
D default constructor" constructed by parameter5 destructed destructed


题解:我们首先有一个拷贝构造的临时对象,又有一个temp对象,因此需要两次析构函数。选择A

总结

被多态题爆杀了一阵子,也稍微参悟了一些内容,分享给大家。在这里插入图片描述

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

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

相关文章

瞪羚优化算法(Gazelle Optimization Algorithm,GOA)

瞪羚优化算法&#xff08;Gazelle Optimization Algorithm&#xff0c;GOA&#xff09;由Agushaka等人于2022年提出&#xff0c;该算法模拟了瞪羚逃避捕食者的行为&#xff0c;思路新颖&#xff0c;性能高效。 瞪羚的身高60-110厘米&#xff0c;体重13-29千克。该属物种有像小鹿…

【Linux】基本指令(上)

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;操作系统&…

Linux - 第2节 - Linux环境基础开发工具使用

1.Linux 软件包管理器 yum centos 7中安装软件的方式&#xff1a; &#xff08;1&#xff09;源码安装 &#xff08;2&#xff09;rpm包安装 &#xff08;3&#xff09;yum安装 yum安装的好处&#xff1a; &#xff08;1&#xff09;不用编译源码 &#xff08;2&#xff09;不用…

赶紧进来看看---C语言实现学生信息管理系统(2.0动态内存版)

本文介绍了将学生信息管理系统静态版本改造为动态内存版本,主要涉及改造思路,枚举类型的使用,动态内存函数和柔性数组的使用,动手写程序才能使基础知识更为牢固…(文章最后有源码展示) 学生信息管理系统1.0静态版->学生信息管理系统2.0动态内存版 c语言实现学生信息管理系统…

在python中使用ggplot2

python的ggplot2库:plotnine > 一.安装方法&#xff1a; pip install plotnine使用的编译器&#xff1a;pycharm 二.plotnine绘图 1.第一个图形 除了导包的操作不一致&#xff0c;其他类似 from plotnine import ggplot, geom_point, aes, stat_smooth, facet_wrap fr…

70.【JavaScript 6.0】

前端三要素1.前端三要素2.引入JavaScript3.JavaScript基本语法入门4.数据类型5.严格检查模式( use strict)6.Map和Set7.函数的定义和参数获取8.变量的作用域(局部 全局)-------> 和Java一样9.全局规范:10.方法的定义和调用11.内部对象1.Date--------->日期2.JSON--------…

自定义mybatis插件实现sql日志打印

自定义mybatis插件实现sql日志打印 mysql插件实现原理 官网的关键信息 参考文档 https://mybatis.org/mybatis-3/zh/configuration.html#plugins 官方文档 MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下&#xff0c;MyBatis 允许使用插件来拦截的方…

【JavaSE】一篇文章领悟Java运算符

前言&#xff1a; 作者简介&#xff1a;爱吃大白菜1132 人生格言:纸上得来终觉浅&#xff0c;绝知此事要躬行 如果文章知识点有错误的地方不吝赐教&#xff0c;和大家一起学习&#xff0c;一起进步&#xff01; 如果觉得博主文章还不错的话&#xff0c;希望三连支持&#xff01…

Java项目:超市管理系统(java+SSM+JSP+LayUI+jQ+Mysql)

源码获取&#xff1a;俺的博客首页 "资源" 里下载&#xff01; 项目介绍 本项目分为超级管理员、总经理、店长、员工等角色&#xff0c;超级管理员可添加修改删除角色并进行角色菜单配置&#xff1b; 超级管理员角色包含以下功能&#xff1a; 商品管理&#xff1a;添…

C语言高级-4栈

14天阅读挑战赛 目录 一、栈的原理 1、栈的定义 2、栈的应用 &#xff08;1&#xff09;选课问题 &#xff08;2&#xff09;旅游&#xff1a;怎么样把每个城市去且仅去一遍&#xff1f; &#xff08;3&#xff09;栈的使用场景 &#xff08;4&#xff09;思考&#xf…

C++多态之虚函数表详解及代码示例

引言 C相对其他面向对象语言来说&#xff0c;之所以灵活、高效。很大程度的占比在于其多态技术和模板技术。C虚函数表是支撑C多态的重要技术&#xff0c;它是C动态绑定技术的核心。 如果对多态还不了解的小伙伴&#xff0c;可以点这里C多态详解基础篇。 在不考虑继承的情况下…

Vue3 Hooks 模块化抽离

Vue3中的Hooks 其实就是业务逻辑的抽离&#xff0c;跟Vue2中mixin 本质上是一样的&#xff1a;将当前组件的业务逻辑抽离到一个公共的文件中&#xff0c;提高逻辑复用性&#xff0c;让当前组件看起来更加清爽&#xff0c;不太一样的地方是我们封装hooks 的时候一般是返回一个函…

如何不改动 GatewayWorker 依赖包下自定义协议

前言&#xff1a; GatewayWorker 是 Workerman 的一个框架&#xff0c;对应用层开发者更友好。GatewayWorker 多了一个网关&#xff0c;也就是 Gateway&#xff0c;负责与客户端连接&#xff0c;消息转发等。而自定义的协议&#xff0c;也就是 gateway 面向客户端提供服务的协议…

java毕业设计——基于java+JDBC+sqlserver的物业管理系统设计与实现(毕业论文+程序源码)——物业管理系统

基于javaJDBCsqlserver的物业管理系统设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于javaJDBCsqlserver的物业管理系统设计与实现&#xff0c;文章末尾附有本毕业设计的论文和源码下载地址哦。 文章目录&#xff1a; 基于javaJDB…

【H5微信授权】简单实现H5页面微信授权功能,微信开发者工具报错 系统错误,错误码-1,undefined解决办法【详细】

前言 最近写到了H5公众号&#xff0c;需要微信授权的功能。 这里记录一下授权的流程和踩了个坑 图片 授权代码执行后会跳转到授权的地方&#xff0c;没有授权的会有确认授权&#xff0c;授权过得会这样&#xff0c;直接自动登录&#xff0c;然后再跳转到中转页 授权流程 …

204 - 205.表的基本用法

表的基本操作 1.基本概念 1.1数据库和表的关系 每个数据库包含N张表&#xff0c;及表示在库中 1.2 表&#xff08;二维表&#xff09; 行和列组成&#xff0c;可以将复杂的数据保存在简单的表中 表中的每一行就是一条完整的记录 表中的列用于保存每条记录中特点的信息 2.…

【Redis】散列表(Hash)和列表(List)的运用和理解以及Hash和List应用场景对比详解

文章目录一. 散列表(hash)1.1 基本操作1.2 当value字符串的内容是数字时二.列表&#xff08;List&#xff09;2.1 基本操作三.Hash和List的应用场景3.1Hash的应用场景3.2List的应用场景一. 散列表(hash) Redis哈希是字符串类型字段和值的映射表。哈希特别适合存储对象。 Redis中…

mindspore.dataset的map问题

1、创建一个包含transform的自定义类并实例化 2. 类的实现如下&#xff1a; 请注意&#xff1a;在call函数中&#xff0c;我并没有调用init中定义的transform操作。 3. ImageFolder_forPretrain的定义如下。 在划红线的那行&#xff0c;出现错误。 错误信息&#xff1a; 疑问…

【Spark】spark-submit作业提交及参数设定

note 文章目录note一、Spark的常用启动方式1.1 local本地模式1.2 Standalone模式1.3 Spark on Yarn模式二、spark-submit 详细参数说明--master--deploy-mode--class--name--jars--packages--exclude-packages--repositories--py-files--files--conf PROPVALUE--properties-fil…

【趣学算法】Day3 贪心算法——背包问题

14天阅读挑战赛努力是为了不平庸~ 算法学习有些时候是枯燥的&#xff0c;这一次&#xff0c;让我们先人一步&#xff0c;趣学算法&#xff01; ❤️一名热爱Java的大一学生&#xff0c;希望与各位大佬共同学习进步❤️ &#x1f9d1;个人主页&#xff1a;周小末天天开心 各位大…