• C++ 多态类型


    多态

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

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

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

    C++ 多态分类:

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

    The Four Polymorphisms in C++

    • 参数多态(编译期):返回值相同,参数列表不同
    • 重载多态(编译期):函数重载、运算符重载,重定义基类函数
    • 子类型多态(运行期):虚函数
    • 强制多态(编译期/运行期):基本类型转换、自定义类型转换
    代码释义
    #include 
    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

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

  • 相关阅读:
    ise使用ChipScope时报错NgdBuild:604
    Android---APK 瘦身
    云原生分级SLA
    git及dbc的学习
    哪吒汽车年营收57亿:扣非后净亏31亿 360放弃10亿增持
    Springboot 配置使用 RabbitMQ 并实现延时队列
    Spring——IOC容器启动及Bean生成流程
    Java----模拟学生成绩管理系统
    Postman如何做接口测试6:如何使用外部 json 文件数据
    PyQt5快速开发与实战 7.1 信号与槽介绍
  • 原文地址:https://blog.csdn.net/u013052326/article/details/127717558