(name-hiding), 至于这两个名称类型是否相同并不被考虑
这是非常危险的特性, 如下图派生类中的mf3函数会将基类的两个mf3一起进行遮掩, 无论基类那两个函数类型和形式是什么样的
因此对于公有继承来说..., 只和重载一样和名称与参数有关, 所以很容易二义
更复杂的情况是下图的"菱形继承":
菱形继承中, 对于不同基类都拥有的同名成员, C++默认会复制多份以供使用, 如果不希望复制就应该使用虚继承,..., 在编译期才被具现化出来), 需要的是隐式接口(参数被传入模板后受到模板中的调用)和编译期多态(不同模板参数具象化出不同的模板导致了调用不同的接口), 很难把握
隐式接口并不基于函数签名式决定, 而是按照模板内的表达式决定...只有一种例外, 不允许在成员初值列和基类列中使用typename
部分编译器接受没有typename的代码的编译, 但这是不规范的, 我们还是应该手动写好
43 学习处理模板化基类内的名称
编译器无法知道模板类实际上继承了模板基类的什么内容...模板在编写的时候非常方便, 但是一旦使用不当, 模板被编译器具现化的时候可能会产生非常多的重复二进制代码
和普通的函数编写不同, 模板的重复无法直观看出来, 需要想象目标模板被多个不同类型具现化的时候可能发生的重复