对于class来说是:显式接口、运行期多态
-
显式接口:由函数签名式(函数名称、参数类型、返回值类型)组成
-
运行期多态:根据运行期对象的实际类型决定调用哪个函数
对于template来说就是:隐式接口、编译期多态
- 隐式接口:不基于函数签名式,而是由有效表达式组成
- 编译期多态:以不同的template参数具现化函数模板会导致调用不一样的函数
编译期多态与运行期多态的区别,类似于:”哪一个重载函数该被调用(发生在编译期)“和”哪一个virtual函数应该被绑定(发生在运行期)“之间的差异
条款42:了解typename的双重意义第一重:在声明template类型参数的时候,class和typename没有差别
templateclass A; template class B;
第二重:如果模板内出现的某个名称依赖于某个模板参数,称之为从属名称,如果从属名称在class内呈现嵌套状,称之为嵌套从属名称(如 T::变量名称 或 T::方法名称);在使用嵌套从属名称的时候,要在前面加上typename
有两种例外情况:
- typename不能出现在类继承列表中
- 也不能出现在成员初始化列表中
可在子类模板中通过this->找到积累模板中的成员名称;或者使用using声明基类的成员名称
条款45:使用成员函数模板接受所有兼容类型泛化copy构造函数:这一类构造函数根据对象u创建对象t,而u和t的类型是同一个模板的不同具现体
泛化copy构造函数不用声明为explicit,因为原始指针类型之间的转换(例如从子类指针转换为基类指针)是隐式转换,不用写明转型动作(cast)
- 使用成员函数模板生成“可接受所有兼容类型”的函数
- 如果声明成员模板用于泛化copy构造函数和泛化赋值运算符,还是需要正常的copy构造函数和copy赋值操作符



