C++中的多态分为动多态和静多态。
动多态是通过继承和虚函数来实现的,这两个机制都是在运行期进行处理的。平常所谈论的C++多态指的就是这种动多态。
模板也允许使用单一的泛型标记来关联不同的特定行为,这种借助于模板的关联是在编译器进行处理的,因此把这种多态称为静多态。
一、动多态
动多态的设计思想主要在于:对于几个相关对象的类型,确定它们之间的一个共同功能集,然后在基类中,把这些共同的功能声明为多个虚函数接口。
动多态例子:
#include <iostream>
using namespace std;
class GeoObj{
public:
virtual void draw() const = 0;
};
class Circle : public GeoObj{
public:
void draw() const{
cout << "circle is drawing!" << endl;
}
};
class Line : public GeoObj{
public:
void draw() const{
cout << "line is drawing!" << endl;
}
};
void myDraw(GeoObj const& obj){
obj.draw();
}
int main(){
Line l;
Circle c;
myDraw(l);
myDraw(c);
system("pause");
return 0;
}
二、静多态
静多态例子:
#include <iostream>
using namespace std;
class GeoObj{
public:
virtual void draw() const = 0;
};
class Circle : public GeoObj{
public:
void draw() const{
cout << "circle is drawing!" << endl;
}
};
class Line : public GeoObj{
public:
void draw() const{
cout << "line is drawing!" << endl;
}
};
template<typename T>
void myDraw(T const& obj){
obj.draw();
}
int main(){
Line l;
Circle c;
myDraw(l);
myDraw(c);
system("pause");
return 0;
}
三、动多态和静多态比较
动多态和静多态:
通过继承实现的多态是绑定的和动态的;通过模板实现的多态是非绑定的和静态的。
动多态优点:
a、能够优雅地处理异类集合。
b、可执行代码的大小通常比较小(因为只需要一个多态函数,但对于静多态而言,为了处理不同的类型,必须生成多个不同的模板实例)。
c、可以对代码进行完全编译;因此并不需要发布实现源码(但是,分发模板库通常都需要同时分发模板实现的源代码)。
静多态优点:
a、可以很容易地实现内建类型的集合。
b、所生成的代码效率通常比较高(因为并不存在通过指针的间接调用,而且,可以进行演绎的非虚拟函数具有更多的内联机会)。
c、对于只提供部分接口的具体类型,如果在应用程序中只是使用到这一部分接口,那么也可以使用该具体类型,而不必在乎该类型是否提供其他部分的接口。
版权声明:本文为博主原创文章,未经博主允许不得转载。