成员函数被重载的特征
( 1 )相同的范围(在同一个类中);
( 2 )函数名字相同;
( 3 )参数不同;
( 4 ) virtual 关键字可有可无。
·
覆盖是指派生类函数覆盖基类函数,特征是
( 1 )不同的范围(分别位于派生类与基类);
( 2 )函数名字相同;
( 3 )参数相同;
( 4 )基类函数必须有 virtual 关键字。
·
“ 隐藏 ” 是指派生类的函数屏蔽了与其同名的基类函数,规则如下
( 1 )如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载混淆)。
( 2 )如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有 virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
现在就"隐藏"举例如下:
派生类中的函数将会覆盖基类函数中的同名函数,而并非通常情况下的重载函数。
Derived class will override instead of overload functions declared in base class
for example:
class Base {
public:
void function(){}
};
class Derived : public Base {
public:
void function(int a){}
};
int main(){
Derived a;
a.function();
return 0;
}
............................
派生类中从基类继承下来的函数 " function() " 被新定义的 " function(int) " 覆盖了,而并非通常情况下我们所希望的 “ 函数重载 ” 。因此上述代码无法通过编译,因为派生类中已经没有 " function() " 这个函数了。这种情况下,即使基类中的函数被定义为虚函数( virtual )也于事无补。
解决方案:
1. 在派生类中添加: " using Base::function; " (需要 g++40 以上版本编译器)
2. 直接使用 " a.Base::function() "