image-20221213140245554

image-20221213140325903

image-20221213140639104

image-20221213140700118

反而变得复杂、可读性变差

image-20221213140851851

添加新的声明 template <typename T>

使用 typename 来声明类型参数而不是 class,防止产生歧义。

image-20221213142015728

image-20221213142501077

如何处理 max (x,m) 的处理【x 和 m 的类型不一样】?

可以定义一个 max 的重载函数。

非模板函数、模板函数(显式具体化)、重载函数 —— 编译器会优先调用重载函数、显式具体化的模板函数,然后是非模板函数,不会出现歧义。函数模板和函数重载可以配合在一起使用。

image-20221213142850552

类也可以模板化。

左边是初始版本,右边是类模板。

在类外定义函数的时候,需要再次声明类型参数 T。 template <class T>

创建的时候需要显式实例化,int 和 double 的 Stack 是两个类。

image-20221213143356564

image-20221213143809099

image-20221213144212201

image-20221213144522445

cpp 完整的定义通常定义在头文件中

file2.cpp 找不到 max 定义,也找不到完整的 S 代码

image-20221213144541044

image-20221213150026993

image-20221220141328851

image-20221220141344849

image-20221220141355901

输入输出流的重定向

先新建一个输入流 ifstream in("in.txt");

保存输入流

重置输入流

测试用例可以从文件读入并输出到文件

image-20221220141909130

不能作为类的成员函数进行重载

不正确的解决方案

image-20221220141922509

正确的解决方案

非虚函数进行虚化,非虚接口。

全局函数针对不同的类也有派生类。调用虚函数。

image-20221220141942718

image-20221220142000257

image-20221220142011316

image-20221220142028306