该博文仅用于交流学习,请慎用于任何商业用途,本博主保留对该博文的一切权利。
博主博客:http://blog.csdn.net/qq844352155
转载请注明出处:
在一个类内,最常见的就是构造函数的重载了.这里我就不介绍了.
先来看看常见的类内重载.
//method.cpp #include <iostream> #include <string> using namespace std; class base{ private: int i; string s; public: base(int ii,string ss):i(ii),s(ss){ } virtual ~base(){ } void add(int ii){ cout<<i<<"+"<<ii<<"="<<i+ii<<endl; } void add(string ss){ cout<<s<<"+"<<ss<<"="<<s+ss<<endl; } };
//main.cpp #include "method.cpp" int main(){ base b(10,"me"); b.add(25); b.add("name is jack!"); return 0; };
运行结果:
这个跟类外的函数重载几乎没有区别,只是这一次需要对象来调用方法而已.
GCC还有个奇怪的行为,
//method.cpp #include <iostream> #include <string> using namespace std; class base{ private: int i; string s; public: base(int ii,string ss):i(ii),s(ss){ } virtual ~base(){ } void add(int ii){ cout<<i<<"+"<<ii<<"="<<i+ii<<endl; } void add(string ss){ cout<<s<<"+"<<ss<<"="<<s+ss<<endl; } void add(string &ss){ cout<<" This is a &string"<<s<<" "<<ss<<endl; } };这个在编译的时候不会报错:但是在编译关联文件的时候却会导致歧义.
//main.cpp #include "method.cpp" int main(){ base b(10,"me"); b.add(25); b.add("name is jack!"); string s="wife is LJ"; b.add(s); return 0; };
可能这个是为了留给用户更多选择的余地吧.
同时要记住是可以通过const重载的,即参数是const和非const也算是不同的参数.
在C++11里面,可以显式删除某个重载方法.例如:
//method.cpp #include <iostream> #include <string> using namespace std; class base{ private: int i; string s; protected: int getI()const{return i;}; string getS()const{return s;}; public: base(int ii,string ss):i(ii),s(ss){ } virtual ~base(){ } void add(int ii){ cout<<i<<"+"<<ii<<"="<<i+ii<<endl; } void add(string ss){ cout<<s<<"+"<<ss<<"="<<s+ss<<endl; } //void add(char c)=delete };
//main.cpp #include "method.cpp" int main(){ base d(15,"you"); d.add(5); d.add("are fine!"); char ch='a'; d.add(ch); return 0; };
没有显式地删除add(char c)之前,运行结果为:
可以看到char被转换为了int类型,这或许不是我们想要的.
因此我们可以手动删除这个重载方法.
#include <iostream> #include <string> using namespace std; class base{ private: int i; string s; protected: int getI()const{return i;}; string getS()const{return s;}; public: base(int ii,string ss):i(ii),s(ss){ } virtual ~base(){ } void add(int ii){ cout<<i<<"+"<<ii<<"="<<i+ii<<endl; } void add(string ss){ cout<<s<<"+"<<ss<<"="<<s+ss<<endl; } void add(char c)=delete };
这样,编译的时候就会报错了.类外的函数重载同样支持delete操作,这里就不演示了.
这个就是类里面的函数重载了.
需要注意的是继承的时候继承类中的重载有比较大的区别.请看下一篇博文.