您的位置:首页 > 编程语言 > C语言/C++

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()

"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: