跳转至

C++多态(静态多态与动态多态)

多态

「多态」即多种形态

  • 程序员只需调用相同的接口(“同名接口”),却可以根据某些规则,分流到不同的代码块中去执行(“多种状态”)
  • 因此,「多态」可简单概括为“同名接口,多种状态“

C++的多态有两种:静态多态、动态多态。

  1. 静态多态有两种实现方式:函数重载、函数模板
  2. 动态多态:可基于虚函数来实现

静态多态(编译期多态)

静态多态,是在编译期完成的。编译器会根据 函数实参的个数与类型 推断出(存在隐式类型转换),所要调用的函数签名。若此函数存在,编译通过,并调用此函数;若函数不存在,则编译报错。

静态编译包括两种实现方法

  • 函数重载:包括普通函数的重载、成员函数的重载
  • 模板技术:包括函数模板、类模板

函数重载

// 函数名相同(同名接口);参数不同(多种状态)
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);

动态多态(运行时多态)

动态多态(或称动态绑定、运行时多态),在程序运行时,根据其实际的类型推断出要调用的方法。一般使用虚函数实现动态多态。

参考文章

  1. 静态多态与动态多态