C++多态(静态多态与动态多态)
多态¶
「多态」即多种形态
- 程序员只需调用相同的接口(“同名接口”),却可以根据某些规则,分流到不同的代码块中去执行(“多种状态”)
- 因此,「多态」可简单概括为“同名接口,多种状态“
C++的多态有两种:静态多态、动态多态。
- 静态多态有两种实现方式:函数重载、函数模板
- 动态多态:可基于虚函数来实现
静态多态(编译期多态)¶
静态多态,是在编译期完成的。编译器会根据 函数实参的个数与类型 推断出(存在隐式类型转换),所要调用的函数签名。若此函数存在,编译通过,并调用此函数;若函数不存在,则编译报错。
静态编译包括两种实现方法
- 函数重载:包括普通函数的重载、成员函数的重载
- 模板技术:包括函数模板、类模板
函数重载¶
// 函数名相同(同名接口);参数不同(多种状态)
void print(const char* str,int width);
void print(double i ,int width);
void print(const char* str);
// 编译器根据函数实参的个数和类型,推断出要调用哪一个
print("abc", 12);
print(2.2, 55);
print("abc");
模板技术¶
基于函数模板来实现
template <typename T, typename U>
//T、U根据使用时具体生成(编译期期间)
auto add(T t, U u) -> decltype(t + u)
//返回值类型事先不知道,可以使用返回值后置,并加上decltype推断它的类型
{
return t + u;
}
// 使用时,编译器再根据参数类型生成具体的函数
auto a = add(1.5, 2);
auto b = add(1, 2);
动态多态(运行时多态)¶
动态多态(或称动态绑定、运行时多态),在程序运行时,根据其实际的类型推断出要调用的方法。一般使用虚函数实现动态多态。