C++ 多态类型

news2024/11/28 5:42:50

多态

C++在面向对象中,多态就是不同对象收到相同消息,执行不同的操作。在程序设计中,多态性是名字相同的函数,这些函数执行不同或相似的操作,这样就可以用同一个函数名调用不同内容的函数。简而言之“一个接口,多种方法”。
多态是以封装和继承为基础的。

多态中的重载、重写和重定义

  • 重载overload:重载函数处在同一作用域(在同一个类中).;
    • 函数名相同、返回值相同、参数列表必须不同;
    • 函数名相同、返回值不同、参数列表不同
  • 重写(覆盖)override:必须是虚函数,且处在父类和子类中;
    • 返回值,参数列表,函数名必须完全相同;
  • 重定义(隐藏)redefining:子类和父类的成员变量相同或者函数名相同,子类隐藏父类的对应成员;
    • 子类和父类的同名非虚函数,但参数列表相同;

C++ 多态分类:

主要分为静态多(编译阶段实现),是由函数重载实现,通过不同的实参调用其相应的同名函数;动态多态通过虚函数实现,基类指针指向子类对象。
主要分成下面这四种类型

The Four Polymorphisms in C++

  • 参数多态(编译期):返回值相同,参数列表不同
  • 重载多态(编译期):函数重载、运算符重载,重定义基类函数
  • 子类型多态(运行期):虚函数
  • 强制多态(编译期/运行期):基本类型转换、自定义类型转换

代码释义

#include <iostream>
#include <memory>
using namespace std;
class I_SoftWare {
public:
	virtual ~I_SoftWare(){};
	//运行期多态
	virtual void RunApp() { std::cout << " Interface SoftWare " << std::endl; };
	//编译器多态
	void BaseName() { std::cout << " I am Interface SoftWare " << std::endl; };
	//参数多态
	void RunTime(int run_time) { std::cout << __FUNCTION__ << " int= " << run_time << std::endl; }
	void RunTime(double run_time) { std::cout << __FUNCTION__ << " double= " << run_time << std::endl; }
	void RunTime(int run_time1, int run_time2)
	{
		std::cout << __FUNCTION__ << " run_time1= " << run_time1 << " run_time2= " << run_time2 << std::endl;
	}
	string RunTime(string a, string b)
	{
		std::string result(a);
		result += b;
		std::cout << __FUNCTION__ << " string= " << result << std::endl; 
		return result;
	}
};
class StreamLiveApp : public I_SoftWare {
public:
	//重写
	void RunApp() { std::cout << " Start Live APP " << std::endl; }
	//重定义(隐藏父类的方法)
	void BaseName() { std::cout << " I am StreamLiveApp " << std::endl; };
};
class IMChatApp : public I_SoftWare {
public:
	//重写
	void RunApp() { std::cout << " Start Chat APP " << std::endl; }
};

int main()
{
	StreamLiveApp obj_live_app;
	IMChatApp     obj_chat_app;

	std::shared_ptr<I_SoftWare> live_app = std::make_shared<StreamLiveApp>();
	std::shared_ptr<I_SoftWare> chat_app = std::make_shared<IMChatApp>();
	std::cout << "================================" << std::endl; 
	//1. 同名函数不同的参数列表:参数多态(编译时确定)
	live_app->RunTime(99);
	live_app->RunTime(3.14);
	live_app->RunTime(99, 1);
	std::cout << "================================" << std::endl; 
	//2 .重载多态(编译时确定)
	//重定义:
	obj_live_app.BaseName();
	obj_chat_app.BaseName();
	//同一个类中重载方法,
	obj_live_app.RunTime("N", "B");
	obj_live_app.RunTime(1, 2);
	//指针不可以
	live_app->BaseName();
	chat_app->BaseName();
	std::cout << "================================" << std::endl; 
	//3. 虚函数重写:子类型多态
	live_app->RunApp();
	chat_app->RunApp();
	std::cout << "================================" << std::endl; 
	//4. 强制多态
	double a= 6;  
	int    b = 3.14;
	cout << "a=" << a << " b=" << b << endl;
	return 0;
}

运行结果:
在这里插入图片描述

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

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

相关文章

2022 国赛postgresql

安装postgresql配置postgresql [root@linux3 ~]# postgresql-setup --initdb //初始化数据库Initializing database in ‘/var/lib/pgsql/data’Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log[root@linux3 ~]# systemctl enable postgresql.service Created …

澳洲最热门职业,护士排第一,医生竟然不如程序员?

2022澳洲最新的职业紧缺名单出炉了&#xff0c;令人惊讶的是护士竟然排行第一名&#xff0c;可见澳洲的医疗人力资源紧缺的问题。 既然人力资源紧缺&#xff0c;那么首当其冲的医生作为高学历且同属医疗行业的代表理应收到重视&#xff0c;然而令人意外的是&#xff0c;通过榜单…

Linux一篇入门(以Ubuntu为例)

一、Linux与Windows区别 Linux&#xff1a;无盘符&#xff0c;只有一个根目录&#xff08;/&#xff09; Windows&#xff1a;有盘符 二、目录相关常见命令 Linux命令格式&#xff1a; cmd -option parameter cdm命令&#xff0c;就是一个操作 parameter一般是要做的对象…

韩国程序员面试考什么?

大家好&#xff0c;我是老三&#xff0c;在G站闲逛的时候&#xff0c;从每日热门上&#xff0c;看到一个韩国的技术面试项目&#xff0c;感觉有点好奇&#xff0c;忍不住点进去看看。 韩国的面试都考什么&#xff1f;有没有国内的卷呢&#xff1f; 可以看到&#xff0c;有8.…

抽象类和接口

文章目录 前言 一、今日回顾 1.《高等数学》 2.阅读&#xff1a; 3.英语&#xff1a; 二、编程的那些事 1.引入库 2.读入数据 总结 前言 一、今日回顾 1.《高等数学》 2.阅读&#xff1a; 3.英语&#xff1a; 二、编程的那些事 1.抽象类的描述 在java中&#xff0…

一次函数与二次函数的联系

首先&#xff0c;无论是一次函数还是二次函数&#xff0c;都是函数&#xff0c;所以便可以从表达式&#xff0c;图像&#xff0c;函数的四个性质&#xff08;即有界性&#xff0c;单调性&#xff0c;奇偶性&#xff0c;周期性&#xff09;去看他们之间的联系 一次函数与二次函…

2022第8届中国大学生程序设计竞赛CCPC桂林站, 签到题4题

文章目录A. LilyM.Youth FinaleC.Array ConcatenationE.Draw a triangleA. Lily A. Lily time limit per test1 second memory limit per test512 megabytes inputstandard input outputstandard output They serve the purpose of changing hydrogen into breathable oxygen,…

MySQL数据库 -- 库和表的操作

关于数据库方面&#xff0c;还是需要多多练习的&#xff0c;否则很多指令不容易记住&#xff0c;所以大家也要在自己的电脑上多写写&#xff0c;熟悉熟悉~ 目录 库的操作 创建数据库 操纵数据库 查看数据库 显示创建语句 修改数据库 数据库的删除 数据库备份和恢复 …

重学数据库基础

幸福找到我&#xff0c;幸福说&#xff1a;“瞧这个诗人&#xff0c;他比我本人还要幸福” 一、数据库相关概念 数据库 存储数据的仓库&#xff0c;数据是有组织的进行存储英文&#xff1a;DataBase&#xff0c;简称 DB 数据库管理系统 管理数据库的大型软件英文&#xff1a;Da…

CSI室内指纹定位——相关通信名词解释

目录 1、无线信道 2、时域与频域 3、信道频率响应&#xff08;Channel Frequency Response,CFR&#xff09; 4、信道冲激响应&#xff08;Channel Impulse Response, CIR&#xff09; 5、信道带宽 6、带宽 7、子载波 9、波长 10、频率 11、振幅 12、相位 13、相位差…

高数值孔径(NA)物镜的聚焦分析

1. 摘要 高NA物镜广泛用于光刻&#xff0c;显微等技术。因此&#xff0c;聚焦仿真中考虑光的矢量性质至关重要。VirtualLab可以非常便捷地对此类镜头进行光线追迹和场追迹分析。通过场追迹&#xff0c;可以清楚地观察由于矢量效应引起的聚焦光斑失对称现象。利用相机探测器和电…

第十四届蓝桥杯(Web应用开发)模拟赛1期-大学组

数据类型检测 请看这篇数据类型检测 渐变色背景生成器 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name&…

java面试官:程序员,请你告诉我是谁把公司面试题泄露给你的?

前情提要&#xff1a; 面试官&#xff1a;你好&#xff01;请先做一下自我介绍&#xff01; 程序员&#xff1a;balabalabala... 前戏先过了.... 面试官&#xff1a;先介绍SpringCloud核心组件及其作用 程序员&#xff1a;SpringCloud由以下5个核心组件构成...另外&#x…

MySQL事务基本操作(方式1)

在观看本文前 你需要了解什么事事务 如果不太了解 可以先查看我的文章 MySQL事务基本概念 首先 我们这里有一张 staff 用户表 然后来一波 减岁交易大法 赵敏买个了 黄飞鸿十年时光 那么就是 先查询确认赵敏加上十岁不会过百 将赵敏年龄加十岁 确认黄飞鸿减去十岁不会小于零 然…

Java项目(三)-- SSM开发社交网站(9)--后台图书管理功能

后台图书管理功能 富文本编辑器wangEditor 基于javascript与css开发是Web富文本编辑器&#xff0c;轻量、简洁、易用、开源免费。 代码演示 我们在test.ftl中添加富文本编辑器演示下 <!DOCTYPE html> <html lang"en"> <head><meta charset&…

CMake中string的使用

CMake中的string命令用于字符串操作,其格式如下&#xff1a; Search and Replacestring(FIND <string> <substring> <out-var> [...])string(REPLACE <match-string> <replace-string> <out-var> <input>...)string(REGEX MATCH &l…

【数据库Redis】Redis五种基本数据结构以及三种配置方式——默认配置、运行配置、配置文件启动

文章目录一、初识Redis1.1 了解Redis1.2 Redis特性1.3 Redis使用场景Redis不适合场景1.4 用好Redis的建议1.5 正确安装并启动Redis在Linux上安装Redis在Windows上安装Redis配置、启动、操作、关闭Redis1)、启动Redis2)、Redis命令行客户端3)、停止Redis服务1.6 Redis重大版本一…

JVM(十四)—— StringTable

JVM&#xff08;十四&#xff09;—— StringTableString的基本特性String的内存分配字符串拼接intern方法常见面试题&#xff1a;到底创建了几个String对象String的基本特性 作为一名Java程序员肯定少不了和 String打交道&#xff0c;使用方法就是将字符串用一对""…

SpringCloud 远程调用

目录 1. SpringCloud 2. Nacos 3. 远程通信 3.1 创建公共子模块 (nacos_commons) 3.1.1 DTO对象 3.2 父项目引入子项目 (nacos_commons) 打成的jar包 3.3 父项目指向子项目 (nacos_commons) 为儿子 3.4 子项目 (nacos_provider) 3.5 子项目 (nacos_consumer) …

【Netty】九、Netty自定义协议

Netty自定义协议一、Netty自定义协议二、 协议设计三、 协议实现编码&#xff1a;解码&#xff1a;时间轮算法Netty中的时间轮一、Netty自定义协议 公有协议&#xff08;http、tcp&#xff09;、私有协议&#xff08;自己定义的&#xff0c;不是行业标准&#xff09; 我们知道…