C++中模板与多态的区别

一、问题

开发中遇到个问题,问题如下:
比如有三种类型的形状类,比如矩形类,柱状体类,椭圆类,每个类都有相同的地方,都是绘制,设置旋转,设置颜色等操作。也有不同之处,但是类内的函数名称都一样。调用时,我们是使用模板类呢,还是用多态?

二、方案

如果用多态,先将形状类中相同的属性归为基类,再继承出三种派生类,基类函数定为虚函数,采用多态实现派生类每个同名函数不同作用。这样别人调接口时,只需要实例化好三种类型中的任意一个,直接作为参数传入我写好的接口中(传入之前最好用static_cast强转一下,为了安全起见)。

如果用模板类,使用全特化,分别定义每个形状的操作。

Rectangle

class Rectangle
{
public:
	Rectangle();
	~Rectangle();

public:
	void DrawShape();
	
};

 Elipse

class Elipse
{
public:
	Elipse();
	~Elipse();


public:
	void DrawShape();
};

 MyShape

template <typename T>
class MyShape
{
public:
	MyShape(T temp);
	~MyShape();

public:
	void DrawShape();
private:
	T *elem;
};


template<>//全特化,由于是全特化,参数都指定了,参数列表故为空。

class MyShape<Elipse>
{
public:
	MyShape();
	MyShape(Elipse temp);
	~MyShape();

public:
	void DrawShape();
private:
	Elipse *elem;
};


template<>//全特化,由于是全特化,参数都指定了,参数列表故为空。

class MyShape<Rectangle>
{
public:
	MyShape(Rectangle temp);
	~MyShape();

public:
	void DrawShape();
private:
	Rectangle *elem;
};
int main()
{
	Rectangle rect;
	Elipse elipse;
	MyShape<Rectangle> *recShape = new MyShape<Rectangle>(rect);
	MyShape<Elipse> *eliShape = new MyShape<Elipse>(elipse);
	recShape->DrawShape();
	eliShape->DrawShape();
}

三。总结

表面上看:模板与多态本身就是两个东西。模板实例化是发生在编译期(Compile-time)的,而多态中的函数调用决议是发生在运行时(Run-time)。
实际上:模板是静多态,模板是在编译时确定的,而平时我们说的多态是动多态,是在运行时确定。也就是多态分为两种:静多态和动多态。

从本质上讲,多态性与派生类无关。多态性只是意味着在不了解类型的情况下使用类型的能力。多态性不是使用具体的类型,而是依靠某种形式的原型来定义所采用的类型。

 

其实可以很简便的理解为:模板是“多对一”,多态是“一对多”。
用函数来举例:
“多对一”:无论参数是什么类型,这个函数都使用
“一对多”:每个类型的实例都需要自己去实现虚函数,借由虚函数列表,多态会自动找到对应的同名函数并调用。

面向对象编程关注的是编程的数据方面,而泛型编程关注的是算法。所以,回到这个问题本身,我们应该用抽象类,虚函数,而不是用泛型,模板类来实现。

https://blog.csdn.net/swh1993316/article/details/85159957

猜你喜欢

转载自blog.csdn.net/sinat_31608641/article/details/107450508
今日推荐