我是靠谱客的博主 贤惠眼神,这篇文章主要介绍C++中模板与多态的区别,现在分享给大家,希望可以做个参考。

一、问题

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

二、方案

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

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

Rectangle

复制代码
1
2
3
4
5
6
7
8
9
10
11
class Rectangle { public: Rectangle(); ~Rectangle(); public: void DrawShape(); };

 Elipse

复制代码
1
2
3
4
5
6
7
8
9
10
11
class Elipse { public: Elipse(); ~Elipse(); public: void DrawShape(); };

 MyShape

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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; };
复制代码
1
2
3
4
5
6
7
8
9
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++中模板与多态内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部