方法重写与方法隐藏

该博文仅用于交流学习,请慎用于任何商业用途,本博主保留对该博文的一切权利。
博主博客:http://blog.csdn.net/qq844352155

转载请注明出处:


方法重写.是指在子类中重新编写父类中的虚函数的实现.要求子类中的函数必须跟父类中的原型一致.

包括返回值类型(协变返回类型不算)以及参数的数目,排列顺序.

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4. class base{  
  5. public:  
  6.     virtual void show(int i,string s){  
  7.         cout<<i<<"+"<<s<<endl;  
  8.         cout<<"This is base show!"<<endl;  
  9.     }  
  10. };  
  11. class dirved:public base{  
  12. public:  
  13.     virtual void show(int i,string s){  
  14.         cout<<i<<"&"<<s<<endl;  
  15.         cout<<"This is dirved show!"<<endl;  
  16.     }  
  17. };  
  18.   
  19. int main(){  
  20.     base b;  
  21.     b.show(10,"base");  
  22.     dirved d;  
  23.     d.show(20,"dirved");  
  24. }  


通过方法的重写,即可定义同一函数在继承层次中的不同行为!

如果在子类中使用父类虚方法的名称,但是参数不同,那么这个不是重写父类的方法,也不会重载方法,而是创建一个新方法.

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4. class base{  
  5. public:  
  6.     virtual void show(int i,string s){  
  7.         cout<<i<<"+"<<s<<endl;  
  8.         cout<<"This is base show!"<<endl;  
  9.     }  
  10. };  
  11. class dirved:public base{  
  12. public:  
  13.     /* 
  14.     virtual void show(int i,string s){ 
  15.         cout<<i<<"&"<<s<<endl; 
  16.         cout<<"This is dirved show!"<<endl; 
  17.     }*/  
  18.     virtual void show(){  
  19.         cout<<"This is void dirved show!"<<endl;  
  20.     }  
  21. };  
  22.   
  23. int main(){  
  24.     base b;  
  25.     b.show(10,"base");  
  26.     dirved d;  
  27.     //d.show(20,"dirved");  
  28.     d.show();  
  29. }  

这个时候,父类中的show()方法将被隐藏,即dirved类中无法再使用show(int,string)方法.

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4. class base{  
  5. public:  
  6.     virtual void show(int i,string s){  
  7.         cout<<i<<"+"<<s<<endl;  
  8.         cout<<"This is base show!"<<endl;  
  9.     }  
  10. };  
  11. class dirved:public base{  
  12. public:  
  13.     /* 
  14.     virtual void show(int i,string s){ 
  15.         cout<<i<<"&"<<s<<endl; 
  16.         cout<<"This is dirved show!"<<endl; 
  17.     }*/  
  18.     virtual void show(){  
  19.         cout<<"This is void dirved show!"<<endl;  
  20.     }  
  21. };  
  22.   
  23. int main(){  
  24.     base b;  
  25.     b.show(10,"base");  
  26.     dirved d;  
  27.     d.show(20,"dirved");  
  28.     d.show();  
  29. }  
编译结果:



可以看出,对于dirved类来说,show(int,string)这个方法被隐藏起来了,即对于dirved对象来说不可见了!因此只要在子类中重新定义了父类的虚方法,父类中的所有与该方法重载的方法都将被隐藏!

这一点需要特别注意!

下面再看一些有趣的东西:

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4. class base{  
  5. public:  
  6.     virtual void show(int i,string s){  
  7.         cout<<i<<"+"<<s<<endl;  
  8.         cout<<"This is base show!"<<endl;  
  9.     }  
  10. };  
  11. class dirved:public base{  
  12. public:  
  13.     virtual void show(int i,string s){  
  14.         cout<<i<<"&"<<s<<endl;  
  15.         cout<<"This is dirved show!"<<endl;  
  16.     }  
  17. };  
  18.   
  19. int main(){  
  20.   
  21.     dirved d;  
  22.     d.show(10,"show()");  
  23.     base &ref=d;  
  24.     ref.show(100,"ref show()");  
  25. }  

子类中正确的重写了父类中的show方法,


结果没有疑问.但是如果你重写子类的show方法的时候,发现应该用double代替int,于是i更改为

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4. class base{  
  5. public:  
  6.     virtual void show(int i,string s){  
  7.         cout<<i<<"+"<<s<<endl;  
  8.         cout<<"This is base show!"<<endl;  
  9.     }  
  10. };  
  11. class dirved:public base{  
  12. public:  
  13.     virtual void show(double i,string s){  
  14.         cout<<i<<"&"<<s<<endl;  
  15.         cout<<"This is dirved show!"<<endl;  
  16.     }  
  17. };  
  18.   
  19. int main(){  
  20.   
  21.     dirved d;  
  22.     d.show(10,"show()");  
  23.     base &ref=d;  
  24.     ref.show(100,"ref show()");  
  25. }  

运行结果:


看到没有!最后那个ref.show(int,string)调用了base里面的show方法!(100可以换成9.8更明显)

明明是dirved对象的引用,怎么就调用了base里面的show方法呢?因为这实际上是创建了一个新方法!

可用override关键字来避免这种情况!

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4. class base{  
  5. public:  
  6.     virtual void show(int i,string s){  
  7.         cout<<i<<"+"<<s<<endl;  
  8.         cout<<"This is base show!"<<endl;  
  9.     }  
  10. };  
  11. class dirved:public base{  
  12. public:  
  13.     virtual void show(double i,string s)override{  
  14.         cout<<i<<"&"<<s<<endl;  
  15.         cout<<"This is dirved show!"<<endl;  
  16.     }  
  17. };  
  18.   
  19. int main(){  
  20.   
  21.     dirved d;  
  22.     d.show(10,"show()");  
  23.     base &ref=d;  
  24.     ref.show(95.9,"ref show()");  
  25. }  

override表示你是想要重写base类的show方法而不是创建一个新的show方法,因此如果参数不对就会报错!

需要注意的是,即便是重写,只要在子类中重新定义了,父类中的相应重载函数都将会被隐藏!

如果不想既想使用父类中的show,又想重写某一个show(),可以利用using 

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4. class base{  
  5. public:  
  6.     virtual void show(int i,string s){  
  7.         cout<<i<<"+"<<s<<endl;  
  8.         cout<<"This is base show!"<<endl;  
  9.     }  
  10.     virtual void show(){  
  11.         cout<<"this is a void show"<<endl;    
  12.     }  
  13. };  
  14. class dirved:public base{  
  15. public:  
  16.     //using   
  17.     using base::show;  
  18.     virtual void show(int i,string s)override{  
  19.         cout<<i<<"&"<<s<<endl;  
  20.         cout<<"This is dirved show!"<<endl;  
  21.     }  
  22. };  
  23.   
  24. int main(){  
  25.   
  26.     dirved d;  
  27.     d.show(10,"show()");  
  28.     base &ref=d;  
  29.     ref.show(95.9,"ref show()");  
  30.     d.show();  
  31. }  


这样就两全其美啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值