C++中隐藏的概念

    xiaoxiao2026-10-03  9

    隐藏是指在继承过程中子类和父类存在同名函数的一种情况,他和重写很相似,但是是完全不同的两个概念。下面先对两个概念进行说明: 重写:重写翻译自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修饰,并且子类函数名,参数列表,返回值类型与基类的完全一样。

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

    转载请注明原文地址: https://ju.6miu.com/read-1312594.html
    最新回复(0)