概述
一、问题
开发中遇到个问题,问题如下:
比如有三种类型的形状类,比如矩形类,柱状体类,椭圆类,每个类都有相同的地方,都是绘制,设置旋转,设置颜色等操作。也有不同之处,但是类内的函数名称都一样。调用时,我们是使用模板类呢,还是用多态?
二、方案
如果用多态,先将形状类中相同的属性归为基类,再继承出三种派生类,基类函数定为虚函数,采用多态实现派生类每个同名函数不同作用。这样别人调接口时,只需要实例化好三种类型中的任意一个,直接作为参数传入我写好的接口中(传入之前最好用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
最后
以上就是贤惠眼神为你收集整理的C++中模板与多态的区别的全部内容,希望文章能够帮你解决C++中模板与多态的区别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复