多态
C++在面向对象中,多态就是不同对象收到相同消息,执行不同的操作。在程序设计中,多态性是名字相同的函数,这些函数执行不同或相似的操作,这样就可以用同一个函数名调用不同内容的函数。简而言之“一个接口,多种方法”。
多态是以封装和继承为基础的。
多态中的重载、重写和重定义
- 重载overload:重载函数处在同一作用域(在同一个类中).;
- 函数名相同、返回值相同、参数列表必须不同;
- 函数名相同、返回值不同、参数列表不同
- 重写(覆盖)override:必须是虚函数,且处在父类和子类中;
- 返回值,参数列表,函数名必须完全相同;
- 重定义(隐藏)redefining:子类和父类的成员变量相同或者函数名相同,子类隐藏父类的对应成员;
- 子类和父类的同名非虚函数,但参数列表相同;
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;
}
运行结果: