C++学习笔记24,方法重写与方法隐藏
该博文仅用于交流学习。请慎用于不论什么商业用途。本博主保留对该博文的一切权利。
博主博客:http://blog.csdn.net/qq844352155
转载请注明出处:
方法重写.是指在子类中又一次编写父类中的虚函数的实现.要求子类中的函数必须跟父类中的原型一致.
包含返回值类型(协变返回类型不算)以及參数的数目,排列顺序.
#include <iostream> #include <string> using namespace std; class base{ public: virtual void show(int i,string s){ cout<<i<<"+"<<s<<endl; cout<<"This is base show!"<<endl; } }; class dirved:public base{ public: virtual void show(int i,string s){ cout<<i<<"&"<<s<<endl; cout<<"This is dirved show!"<<endl; } }; int main(){ base b; b.show(10,"base"); dirved d; d.show(20,"dirved"); }
通过方法的重写,就可以定义同一函数在继承层次中的不同行为!
假设在子类中使用父类虚方法的名称,可是參数不同,那么这个不是重写父类的方法,也不会重载方法,而是创建一个新方法.
#include <iostream> #include <string> using namespace std; class base{ public: virtual void show(int i,string s){ cout<<i<<"+"<<s<<endl; cout<<"This is base show!"<<endl; } }; class dirved:public base{ public: /* virtual void show(int i,string s){ cout<<i<<"&"<<s<<endl; cout<<"This is dirved show!"<<endl; }*/ virtual void show(){ cout<<"This is void dirved show!"<<endl; } }; int main(){ base b; b.show(10,"base"); dirved d; //d.show(20,"dirved"); d.show(); }
这个时候,父类中的show()方法将被隐藏,即dirved类中无法再使用show(int,string)方法.
#include <iostream> #include <string> using namespace std; class base{ public: virtual void show(int i,string s){ cout<<i<<"+"<<s<<endl; cout<<"This is base show!"<<endl; } }; class dirved:public base{ public: /* virtual void show(int i,string s){ cout<<i<<"&"<<s<<endl; cout<<"This is dirved show!"<<endl; }*/ virtual void show(){ cout<<"This is void dirved show!"<<endl; } }; int main(){ base b; b.show(10,"base"); dirved d; d.show(20,"dirved"); d.show(); }编译结果:
能够看出,对于dirved类来说,show(int,string)这种方法被隐藏起来了,即对于dirved对象来说不可见了!因此仅仅要在子类中又一次定义了父类的虚方法,父类中的全部与该方法重载的方法都将被隐藏!
这一点须要特别注意!
以下再看一些有趣的东西:
#include <iostream> #include <string> using namespace std; class base{ public: virtual void show(int i,string s){ cout<<i<<"+"<<s<<endl; cout<<"This is base show!"<<endl; } }; class dirved:public base{ public: virtual void show(int i,string s){ cout<<i<<"&"<<s<<endl; cout<<"This is dirved show!"<<endl; } }; int main(){ dirved d; d.show(10,"show()"); base &ref=d; ref.show(100,"ref show()"); }
子类中正确的重写了父类中的show方法,
结果没有疑问.可是假设你重写子类的show方法的时候,发现应该用double取代int,于是i更改为
#include <iostream> #include <string> using namespace std; class base{ public: virtual void show(int i,string s){ cout<<i<<"+"<<s<<endl; cout<<"This is base show!"<<endl; } }; class dirved:public base{ public: virtual void show(double i,string s){ cout<<i<<"&"<<s<<endl; cout<<"This is dirved show!"<<endl; } }; int main(){ dirved d; d.show(10,"show()"); base &ref=d; ref.show(100,"ref show()"); }
执行结果:
看到没有!最后那个ref.show(int,string)调用了base里面的show方法!(100能够换成9.8更明显)
明明是dirved对象的引用,怎么就调用了base里面的show方法呢?由于这实际上是创建了一个新方法!
可用overridekeyword来避免这样的情况!
#include <iostream> #include <string> using namespace std; class base{ public: virtual void show(int i,string s){ cout<<i<<"+"<<s<<endl; cout<<"This is base show!"<<endl; } }; class dirved:public base{ public: virtual void show(double i,string s)override{ cout<<i<<"&"<<s<<endl; cout<<"This is dirved show!"<<endl; } }; int main(){ dirved d; d.show(10,"show()"); base &ref=d; ref.show(95.9,"ref show()"); }
override表示你是想要重写base类的show方法而不是创建一个新的show方法,因此假设參数不正确就会报错!
须要注意的是,即便是重写,仅仅要在子类中又一次定义了,父类中的对应重载函数都将会被隐藏!
假设不想既想使用父类中的show,又想重写某一个show(),能够利用using
#include <iostream> #include <string> using namespace std; class base{ public: virtual void show(int i,string s){ cout<<i<<"+"<<s<<endl; cout<<"This is base show!"<<endl; } virtual void show(){ cout<<"this is a void show"<<endl; } }; class dirved:public base{ public: //using using base::show; virtual void show(int i,string s)override{ cout<<i<<"&"<<s<<endl; cout<<"This is dirved show!"<<endl; } }; int main(){ dirved d; d.show(10,"show()"); base &ref=d; ref.show(95.9,"ref show()"); d.show(); }
这样就两全其美啦!