1:在public的共有继承中
protected的变量在继承的子类中继承为protected的,子类的成员函数可以直接访问,在类外函数调用时,可以通过子类的对象可以访问;
protected的变量在继承的子类中继承为protected的,子类的成员函数可以直接访问,在类外函数调用时,不可以通过子类的对象可以访问;
2:实例
隐藏是指在继承过程中子类和父类存在同名函数的一种情况,他和重写很相似,但是是完全不同的两个概念。下面先对两个概念进行说明:
覆盖:
重写翻译自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.Parent::Dis() //访问父类的函数
- c.Dis(); //隐藏
- return 0;
- }
结果输出如下:
Parent ()
Child
Child::void vDis() //覆盖
Child::void vDis(string s)TEST //隐藏
Parent::void Dis()
~Child
~Parent()