C++中隐藏的概念

来源:互联网 发布:Java中怎样输出Path 编辑:程序博客网 时间:2024/05/29 16:12
隐藏是指在继承过程中子类和父类存在同名函数的一种情况,他和重写很相似,但是是完全不同的两个概念。下面先对两个概念进行说明:
重写:重写翻译自override,也翻译成覆盖,是指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同(花括号内),此时基类中被重写的函数必须有virtual修饰。
隐藏:隐藏是指派生类的函数屏蔽了与其同名的基类函数。这里有两种情况
1>子类函数名,参数列表,返回值类型与基类的完全一样,此时基类中被隐藏的函数不能有virtual修饰(否则就是重写)
2>函数同名,但是参数列表不同,此时基类中被隐藏的函数有没有virtual修饰均可。
请看如下例子

类定义如下:

#include<iostream>#include<functional>#include<string>using namespace std;class Parent{public:Parent () {cout<<"Parent () "<<endl;}~ Parent () {cout<<"~Parent()"<<endl;}virtual void vDis(){cout<<"Parent::virtual void vDis()"<<endl;}void Dis(){cout<<"Parent::void Dis()"<<endl;}};class Child:public Parent{public:Child(){cout<<"Child"<<endl;}~Child(){cout<<"~Child"<<endl;}void vDis(){cout<<"Child::void vDis()"<<endl;}void vDis(string s){cout<<"Child::void vDis(string s)"<<s<<endl;}void Dis(){cout<<"Child::void Dis()"<<endl;}};
考虑如下代码:
int main(){Child c;c.vDis();c.vDis("TEST");c.Dis();return 0;}

结果输出如下:

Parent ()
Child
Child::void vDis()
Child::void vDis(string s)TEST
Child::void Dis()
~Child
~Parent()

结果分析:

第一句函数调用是重写,这一句是如何调用的已经在我上一篇文章中进行了讲解,如果不清楚可以看一下(http://blog.csdn.net/u010857719/article/details/52215091)。  
 第二句是隐藏的第二种情况,此时基类中被重写的函数没有virtual修饰,第三句是隐藏的第一种情况,此时基类中被隐藏的函数不能有virtual修饰,并且子类函数名,参数列表,返回值类型与基类的完全一样。

以上是我关于隐藏与重写之间区别的一点理解,若有错误,请批评指正,谢谢。

0 0
原创粉丝点击