重载
是指函数不同的参数表(参数的类型、个数、顺序不同),对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。
对于重载函数的调用,在编译期间就已经确定,是静态的,它们的地址在编译期间就绑定了与多态无关。
注意,重载不关心函数的返回值类型。
成员函数被重载的特征如下:
(1)相同的范围(在同一个类中)
(2)函数名字相同
(3)参数列表不同
(4)virtual关键字可有可无
覆盖
是指派生类中存在重新定义基类的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体不同,当派生类对象调用子类中该同名函数时会自动调用子类的覆盖版本,而不是父类中的被覆盖函数版本,他和多态真正相关。
覆盖的特征如下:
(1)不同的范围(分别位于派生类与基类)
(2)函数名字相同
(3)参数相同
(4)基类函数必须有virtual关键字
重载与覆盖的区别
(1)覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系
(2)覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系
(3)覆盖要求参数列表相同,重载要求参数列表不同
(4)覆盖关系中,调用方法体是根据对象的类型(对象对应存储空间类型)来决定的,重载关系是根据调用时的实参表与形参表来选择方法体的
隐藏
是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同,则如论有无virtual关键字,基类的函数都会被隐藏
(2)如果派生类的函数与基类同名,并且参数也相同,但是基类函数没有virtual关键字,此时基类的函数被隐藏。
在调用一个类的成员函数时,编译器会沿着类的继承链逐级地向上查找函数的定义,如果找到了就停止查找了。