C++:Private和Protected的成员变量的区别

1:在public的共有继承中

protected的变量在继承的子类中继承为protected的,子类的成员函数可以直接访问,在类外函数调用时,可以通过子类的对象可以访问;

protected的变量在继承的子类中继承为protected的,子类的成员函数可以直接访问,在类外函数调用时,不可以通过子类的对象可以访问;

2:实例

隐藏是指在继承过程中子类和父类存在同名函数的一种情况,他和重写很相似,但是是完全不同的两个概念。下面先对两个概念进行说明:

覆盖

重写翻译自override,也翻译成覆盖,是指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同(花括号内),此时基类中被重写的函数必须有virtual修饰

隐藏:

隐藏:隐藏是指派生类的函数屏蔽了与其同名的基类函数。这里有两种情况
1>
子类函数名,参数列表,返回值类型与基类的完全一样,此时基类中被隐藏的函数不能有virtual修饰(否则就是重写)
2>
函数同名,但是参数列表不同,此时基类中被隐藏的函数有没有virtual修饰均可
请看如下例子

类定义如下:

[cpp]  view plain  copy
  1. #include<iostream>  
  2. #include<functional>  
  3. #include<string>  
  4. using namespace std;  
  5. class Parent  
  6. {  
  7. public:   
  8.     Parent ()   
  9.     {  
  10.         cout<<"Parent () "<<endl;         
  11.     }  
  12.       
  13.     ~ Parent ()   
  14.     {  
  15.         cout<<"~Parent()"<<endl;  
  16.     }  
  17.     virtual void vDis()  
  18.     {  
  19.         cout<<"Parent::virtual void vDis()"<<endl;  
  20.     }     
  21.     void Dis()  
  22.     {  
  23.         cout<<"Parent::void Dis()"<<endl;  
  24.     }  
  25. };  
  26.   
  27. class Child:public Parent  
  28. {  
  29. public:  
  30.     Child()  
  31.     {  
  32.         cout<<"Child"<<endl;  
  33.     }     
  34.     ~Child()  
  35.     {  
  36.         cout<<"~Child"<<endl;  
  37.     }  
  38.     void vDis()  
  39.     {  
  40.         cout<<"Child::void vDis()"<<endl;  
  41.     }     
  42.     void vDis(string s)  
  43.     {  
  44.         cout<<"Child::void vDis(string s)"<<s<<endl;  
  45.     }     
  46.     void Dis()  
  47.     {  
  48.         cout<<"Child::void Dis()"<<endl;  
  49.     }  
  50. };  
考虑如下代码:
[cpp]  view plain  copy
  1. int main()  
  2. {  
  3.     Child c;  
  4.     c.vDis();         //覆盖
  5.     c.vDis("TEST");   //隐藏
  6.     c.Parent::Dis()   //访问父类的函数
  7.     c.Dis();          //隐藏
  8.     return 0;  
  9. }  

结果输出如下:

Parent () 
Child
Child::void vDis()        //覆盖

Child::void vDis(string s)TEST  //隐藏

Parent::void Dis()

Child::void Dis()      //隐藏
~Child
~Parent()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值