目录
1. C++中的多态
2. 模板中的多态
3. 模板多态和传统多态的辨析
1. C++中的多态
C++中的多态通常体现在下面这些情况:
- 有继承关系的父类和子类,父类中必须含有虚函数,子类又重写了父类中的虚函数。
- 当父类的指针指向子类对象或者父类引用了子类对象。
- 通过父类的指针或者引用调用子类中重写了的虚函数时,会调用子类的虚函数。
2. 模板中的多态
模板中的多态不涉及到虚函数,甚至不要父类和子类的这种继承关系。所以压根就不需要父类的指针或引用指向了子类的对象。
模板中的多态可以发生在两个毫不相关的对象上,只要它们拥有相同的接口。
下面通过一个代码片段来感受一下:
#include <iostream>using namespace std;class Cat
{
public:void make_sound(){cout << "喵喵喵!" << endl;}
};class Dog
{
public:void make_sound(){cout << "汪汪汪!" << endl;}
};template<typename T>
void make_sound(T& animal)
{animal.make_sound();
}int main()
{Cat cat;Dog dog;make_sound(cat);make_sound(dog);return 0;
}
运行结果如下图所示:
编译器在编译过程中,根据我们传递给make_sound()的参数,实例化出了make_sound<Cat>和make_sound<Dog>这两个函数,不同的类对象在调用不同的函数。这也是一种多态的感觉。
3. 模板多态和传统多态的辨析
传统多态也叫作动态多态,这是一种运行时的多态,通过在运行时查询虚函数表来决定调用哪个虚函数。调用函数时多了一个查询虚函数表的过程,所以性能上多少会有一些影响。
模板中运用的这种多态技术在编译时就确定了调用哪个函数(make_sound<Cat>或make_sound<Dog>),因此模板堕胎并不存在性能问题。在模板中运用的这种多态技术叫做静态多态,只要传递进来的参数支持相同的接口,就可以调用该成员的函数。
模板中的多态相比于传统多态,省略了从同一个父类中继承和虚函数,代码更加简洁,运行性能更好。