【c++ templates读书笔记】【6】模板的多态

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、对于只提供部分接口的具体类型,如果在应用程序中只是使用到这一部分接口,那么也可以使用该具体类型,而不必在乎该类型是否提供其他部分的接口。



版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/ruan875417/p/4921341.html