C++ 函数重载(overroad) 覆盖(override) 隐藏(hide) 的区别
2010-08-12 14:58
686 查看
[b]成员函数被重载的特征
[/b]
(
1
)相同的范围(在同一个类中);
(
2
)函数名字相同;
(
3
)参数不同;
(
4
)
virtual
关键字可有可无。
·
[b] 覆盖是指派生类函数覆盖基类函数,特征是
[/b]
(
1
)不同的范围(分别位于派生类与基类);
(
2
)函数名字相同;
(
3
)参数相同;
(
4
)基类函数必须有
virtual
关键字。
·
[b]“
[/b]
[b]隐藏
[/b]
[b]”
[/b]
[b]是指派生类的函数屏蔽了与其同名的基类函数,规则如下
[/b]
(
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()
"
[/b]
(
1
)相同的范围(在同一个类中);
(
2
)函数名字相同;
(
3
)参数不同;
(
4
)
virtual
关键字可有可无。
·
[b] 覆盖是指派生类函数覆盖基类函数,特征是
[/b]
(
1
)不同的范围(分别位于派生类与基类);
(
2
)函数名字相同;
(
3
)参数相同;
(
4
)基类函数必须有
virtual
关键字。
·
[b]“
[/b]
[b]隐藏
[/b]
[b]”
[/b]
[b]是指派生类的函数屏蔽了与其同名的基类函数,规则如下
[/b]
(
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()
"
相关文章推荐
- C++ 函数重载(overroad) 覆盖(override) 隐藏(hide) 的区别
- C++ 函数重载(overroad) 覆盖(override) 隐藏(hide) 的区别
- 【C++基础】重载overload、重写(覆盖)override、隐藏hide的区别
- C++多态及重载(overload),覆盖(override),隐藏(hide)的区别
- C++中继承技术引发的问题:重载(overload),覆盖(override)和隐藏(hide)的区别
- 关于C#和C++的重载(Overload)、隐藏(Hide)、覆盖(Override)几个区别比较和得出的疑问
- 函数重载(overload)、覆盖(override)、隐藏(hide)的区别
- C++中继承技术引发的问题:重载(overload),覆盖(override)和隐藏(hide)的区别
- C++学习之多态及重载(overload),覆盖(override),隐藏(hide)的区别
- [转]C++中重载(overload)、覆盖(override)、隐藏(hide)的区别
- C++学习之多态及重载(overload),覆盖(override),隐藏(hide)的区别
- 转---C++学习之多态及重载(overload),覆盖(override),隐藏(hide)的区别
- C++ 函数重载(overload)、函数覆盖(override)与隐藏
- 重载(overload),覆盖(override),隐藏(hide)的区别(转)
- 重载(overload)、覆盖(override)、隐藏(hide)的区别
- 重载(overload),覆盖(override),隐藏(hide)的区别
- 重载(overload),覆盖(override),隐藏(hide)的区别
- 重载(overload),覆盖(override),隐藏(hide)的区别
- 重载(overload)、覆盖(override)、隐藏(hide)的区别
- 重载(overload)、覆盖(override)、隐藏(hide)的区别