一 重载
条件:
1、作用域相同
2、函数名相同
3、参数不同(个数不同、类型不同、顺序不同均可)
举例:
class demo
{
void fun(int a);
void fun(int a, int b); // 参数个数不同,重载
void fun(char *a); // 参数类型不同,重载
int fun(int a); // 仅返回值不同,非重载
int fun(int a, char *s); // 返回值不同,参数个数不同,重载
// 即返回值是否相同均可,不是决定因素
// 特别的
void fun(int a) const; // const修饰的常量成员函数构成重载
// const 修饰参数
void func(int a);
void func(const int a); // 非重载
void func1(int* a);
void func1(const int* a); // 重载
void func2(int* a);
void func2(int* const a); // 非重载
// output:
// 'void demo::func(int)': member function already defined or declared
// 'void demo::func2(int *)': member function already defined or declared
};
二 重写
也叫做覆盖。
条件:
1、作用域不同(分别在父类和子类中)
2、函数名、参数列表、返回值均要相同
3、必须是虚函数(virtual)
4、访问修饰符可以不同
举例:
class base
{
public:
virtual void fun();
};
class derived : public base
{
public:
void fun(); // 重写 (virtual可以忽略不写)
};
三 隐藏
跟重写的区别是函数不为虚函数,则子类函数会隐藏父类函数,子类中要调用父类函数,需要加父类作用域。
举例:
class base
{
public:
void func();
};
class derived : public base
{
public:
void func(); // 隐藏base的func函数
};
四 总结
1、重载和重写最明显的区别是作用域,函数重载作用域相同,函数重写作用域不同。
2、重写和隐藏最明显的区别是是否为虚函数。