重载、重写(覆盖)、隐藏(C++)

一. 定义

1. 重载(overload):

定义
同一个类中的函数具有相同名称,但参数列表不同(参数个数,参数类型),这样同名不同参数的函数之间,互为重载函数,属于编译时多态。
特点
①同一个类中(相同作用域)
②函数名称必须相同
③函数参数必须不同
④函数返回类型可同可不同,不重要

class A{
public:
  void apple(int price);
  void apple(double price);            //overload
  void apple(int count, double price); //overload
  void apple(double price, int count); //overload
  int apple(int price);     //非重载:重载不关心函数返回类型。
};
2. 重写(override):

定义
也称为覆盖,是指子类重新定义父类中有相同函数名,参数列表,返回类型的虚函数。子类对象使用这个方法时,将调用子类中的定义,父类中的定义如同被“屏蔽”了,属于运行时多态。
特点
①函数名、参数列表、返回类型必须完全与被重写方法的相同;
②访问权限不能比父类中被重写的方法的访问权限更低
③重写函数和被重写函数都是virtual函数(派生类函数可以不带virtual关键字)
④声明为final的方法不能被重写。
⑤声明为static的方法不能被重写,但是能够被再次声明。
⑥构造函数不能被重写

class Father  //父类
{
public:
    virtual void func(int i){cout<<"I am father!"<<endl;}
};

class Son: public Father    //子类
{
public:
    virtual void func(int i){cout<<"I am son!"<<endl;}
};

int main()
{
    Father* f = new Son();
    f->func(10);   //Son::func()输出: I am son!
}
3. 隐藏(hide):

定义
也叫重定义,指的是派生类类型的对象、指针、引用访问基类和派生类都有的同名函数时,访问的是派生类的函数,即隐藏了基类的同名函数。

隐藏规则
(1)如果派生类的函数与基类的函数同名参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。
(2)如果派生类的函数与基类的函数同名参数相同,但基类函数没有virtual关键字时,基类的函数被隐藏。

class Father  //父类
{
public:
    void func(int,bool){cout<<"I am father!"<< endl;}
};

class Son : public Father
{
public:
    void func(double){cout<<"I am son!" << endl;}
};

int main()
{
    Son s;
    s.func(1.5);//I am son!
    s.func(1,true);//error C2660:“Son::fun”:函数不接受2个参数
}


二. 重载、重写、隐藏区别

操作 作用域 有无virtual 函数名 参数列表 返回类型
重载 相同 可有可无 相同 不同 可同可不同
重写 不同 相同 相同 相同(协变)
隐藏 不同 可有可无 相同 可同可不同 可同可不同

:重写在协变时返回类型可不同。
协变:C++中只要原来的返回类型是指向基类的指针或引用,新的返回类型是指向派生类的指针或引用,重写可以改变返回类型。这样的类型称为协变返回类型(Covariant returns type)。

你可能感兴趣的:(C++,c++,多态)