最近在复习C++,对函数重载、函数重写、函数重定义与协变返回类型概念很不清晰,所以在此整理总结~~首先来看函数重载与函数重写
函数重载与函数重写
函数重载
1、两个函数在同一个作用域
2、同名不同参(不同的参数类型、不同的参数个数、不同的参数顺序)函数重写
1、两个函数不在同一个作用域(主要在继承关系中体现:分别在基类和派生类)
2、子类重新定义父类中同名同参的虚函数
函数重写需要注意的条件
- 基本条件
1、派生类重写的函数与基类中被重写的函数都必须是virtual函数,子类中最好也写为虚函数
2、参数必须保持一致,否则就是子类中自己的成员函数,未构成函数重写
3、重写的函数与被重写的函数返回值类型相同,或者当返回指针或引用时,子类中重写的函数返回的指针或者引用就是父类中被重写函数所返回指针或引用的子类型(协同返回类型)
4、子类中的函数与父类中的同名函数具有相同的参数和返回值类型时,如果一个是const函数,一个是非const函数,不构成重写 - 注意
1、重写的函数所抛出的异常必须和被重写的函数抛出的异常一致,或者是其子类
2、重写的函数的访问修饰符可以不同于被重写的函数,如基类中被重写的函数访问修饰符为private,派生类中重写的函数的访问修饰符可以为public或protected
3、静态方法不能被重写,因为static与virtual不能同时被使用
4、子类中重写的函数virtual关键字可以加也可以不加, 本质上都是虚函数的属性,只要与基类中的相关函数构成重写关系。
class A{};
class B:public A{};
class C
{
public:
virtual void func1()
{ cout << "C::func1()" << endl;}
virtual A* func2()
{
cout << "C::func2()" << endl;
return new A;
}
virtual A& func3()
{
cout << "C::func3()" << endl;
return *(new A);