C++ 多态类型

多态

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;
}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值