转载自:http://blog.csdn.net/m631521383/article/details/9813987?userName=u013917410&userInfo=Exepgha6JjkQGLgs6P%2FWIKafd%2BIfAtzDVT8CLsjK2SWnwCIt6%2BzXNEAtXyDflsuK
1.重载:要求函数名相同,参数列表不同,重载只是在类的内部存在。与返回类型无关,故不能靠返回类型来判断重载;
2.重定义(隐藏):要求函数名相同,函数类型为非虚函数,与返回类型、函数参数列表无关。重定义是发生在继承子类与父类之间。
当子类的函数名和参数列表和父类相同时,这是要看父类函数是否是virtual虚函数,如果是则是重写,如果不是则是重定义;
3.重写(覆盖):要求函数名相同,参数列表相同,函数类型为virtual虚函数,返回类型相同,重写是发生在继承子类与父类之间。(注意:被重写的函数不能使static,必须是virtual)。
eg:
#include <iostream>
using namespace std;
class Base
{
private:
virtual void display()
{
cout<<"Base display()"<<endl;
}
void say()
{
cout<<"Base say()"<<endl;
}
public:
void exec()
{
display();
say();
}
void f1(string a)
{
cout<<"Base f1(string)"<<endl;
}
void f1(int a)
{
cout<<"Base f1(int)"<<endl;
} //overload重载,两个f1函数在Base类的内部被重载
};
class DeriveA:public Base
{
public:
void display()
{
cout<<"DeriveA display()"<<endl; //override重写,基类中display为虚函数,故此处为重写
}
void f1(int a,int b)
{
cout<<"DeriveA f1(int,int)"<<endl;
}//redefining,f1函数在Base类中不为虚函数,故此处为重定义
void say()
{
cout<<"DeriveA say()"<<endl;
} //redefining,同上
};
class DeriveB:public Base
{
public:
void f1(int a)
{
cout<<"DeriveB f1(int)"<<endl; //redefining,重定义
}
};
int main()
{
DeriveA a;
Base *b=&a;
b->exec();
a.exec();
a.say();
DeriveB c;
c.f1(1);
}
/**运行结果:
DeriveA display()
Base say()
DeriveA display()
Base say()
DeriveA say()
DeriveB f1(int)
Process returned 0 (0x0) execution time : 0.623 s
Press any key to continue.
*/
1.成员函数重载特征:
a相同的范围(在同一个类中)
b 函数名字相同
c 参数不同
2 重写(覆盖)是指派生类函数覆盖基类函数,特征是:
a 不同的范围,分别位于基类和派生类中
b 函数的名字相同
c 参数相同
d 基类函数必须有virtual关键字
3 重定义(隐藏)是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
a 如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。
b 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏