C++templates第十八章模板的多态性

多态在C++中主要由继承和多态实现,这一机制主要在运行期间起作用,因此称为动态多态,模板的多态发生在编译期间,我们称之为静态多态。

动态多态

这里不过多解释,就是C++类与对象的重点知识点:

image-20231113082501690

静态多态

image-20231113082751447

1
2
3
4
5
template<typename Geoobj>
void myDraw (Geoobj const& obj) // Geo0bj is template parameter
{
obj.draw ();
}

动态多态中,Geoobj是基类,静态多态的Geoobj是模板名

我们实现几个类的时候,不再使用层级结构的几何类,而是彼此独立的类

对比

C++中的动态多态有如下优点:

  • 可以很优雅的处理异质集合。
  • 可执行文件的大小可能会比较小(因为它只需要一个多态函数,不像静态多态那样,需要为不同的类型进行各自的实例化)。
  • 代码可以被完整的编译;因此没有必须要被公开的代码(在发布模板库时通常需要发布 模板的源代码实现)。

作为对比,下面这些可以说是 C++中 static 多态的优点:

  • 内置类型的集合可以被很容易的实现。更通俗地说,接口的公共性不需要通过公共基类实现。
  • 产生的代码可能会更快(因为不需要通过指针进行重定向,先验的(priori)非虚函数 通常也更容易被 inline)。
  • 即使某个具体类型只提供了部分的接口,也可以用于静态多态,只要不会用到那些没有被实现的接口即可。