cpp中三种多态
多态(Polymorphism)是一个大家耳熟能详的概念。在传统的C++教学中,我们通常认为“多态”是函数在类继承体系中所表现出来的一种行为。比如,在下面的例子中,
template <typename T> T convertFromInt(int v);
void f1() {
convertFromInt<float>(5);
convertFromInt<double>(5);
}
struct Base {
virtual void doWork() {
// blah blah blah
}
virtual ~Base() { }
};
struct Derived: public Base{
virtual void doWork() {
// blah blah blah 2
}
};
void f2(){
Base* p = new Derived();
p->doWork();
delete p;
}
void Add(int, int);
void Add(double, double);
void f3(){
Add(15, 17);
Add(1.56, 2.28);
}
我们通常只认为f2()
中的行为是由多态机制决定的。
然而,在更广阔的计算机领域中,多态这个词并不只是局限在类继承和虚函数上。只要是同名函数能够根据参数的类型不同而获得不同的实现,我们都可以叫它“多态”。
多态可以分成三类,Ad hoc 多态(Ad hoc ~),参数化多态(Parametric ~),子类型多态(Subtype ~)。
对于Ad hoc多态,首先要神会这个词,我个人通常将其简单替换成 ”The fucking“,“那个多态”。C++中的重载,例子中的函数 f3() 就属于此类。多个同名函数根据参数的不同,选择不同的实现。第二种的典型例子,就是例子中的f1(),通过参数化类型来完成多态。第三种,局限于多态化的函数参数类型是Subtyping的关系,它是C++上狭义的多态,也就是f2()。
参考: