C++:名字查找先于类型检查

Sub-Title: Name Hiding。

"In C++, there is no overloading across scopes - derived class scopes are not an exception to this general rule."

这是C++之父 Bjarne亲口说的话,也是C++不能“跨类重载”的原因(而Java却能做到),在C++ Primer也翻到了解释。

P549:

声明在内层作用域的函数并不会重载声明在外层作用域的函数,因此,定义在派生类中的函数也不会重载其基类中的成员,和其他作用域一样

如果派生类的成员与基类的某个成员同名,则派生类则将在其作用域内隐藏该基类成员。即使派生类成员和基类成员的形参列表不一致,基类

成员也仍然会被隐藏掉。

P551:

和其他函数一样,成员函数无论是否是虚函数都能被重载,派生类可以覆盖重载函数的0个或多个实例。如果派生类希望所有的重载版本对于它

来说都是可见的,那么它就需要覆盖所有的版本,或者一个都不覆盖。

有时候一个类仅需覆盖重载集合中的一些而非全部函数,此时,一种好的解决方案是为重载的成员提供一条using语句。

关于这个问题,可以参考:stackoverflow

另外,仿佛更深刻地理解了虚函数的工作机制(重写必须形参完全相同),以及为什么Java接口多继承时必须覆盖default方法了(有冲突的情况下)。

注意,虚函数表每个类维护一张表,只有在重写的情况下(名字和形参完全相同),才会将父类那个虚函数地址换成子类的虚函数地址,

如果不是这种情况(例如函数名字相同但参数不同),都会在虚函数表后新添一项。

记住:C++中的name hiding机制、如果再和virtual 和 non-virtual函数混合在一起的话会很蛋疼(Java中就没有这破事),所以最好是遵循

best practice:不要覆盖父类的非虚函数,要想覆盖父类函数就把它变虚,注意using声明的使用。

原文地址:https://www.cnblogs.com/niuxichuan/p/6134593.html