重载 重写(覆盖)和重定义(隐藏)

来自 <https://blog.csdn.net/zhejfl/article/details/90199200>

   

重载(overload):是(同一个类中函数名相同参数列表不同

   

重写(override):也叫覆盖。子类重新定义父类中有相同名称和参数的虚函数(virtual)。在继承关系之间。C++利用虚函数实现多态。(override只是在类的内部存在。)

   

重写的特点:

   

1 被重写的函数不能是static的。必须是virtual

   

2 重写函数必须有相同的类型,名称和参数列表

   

3 重写函数的访问修饰符可以不同。尽管父类的virtual方法是private的,派生类中重写改写为public,protected也是可以的。

这是因为被virtual修饰的成员函数,无论他们是private/protect/public的,都会被统一放置到虚函数表中。对父类进行派生时,子类会继承到拥有相同偏移地址的虚函数标(相同偏移地址指的是各虚函数先谷底与VPTR指针的偏移),因此就允许子类对这些虚函数进行重写。

   

重定义(redefining),也叫隐藏。子类重新定义父类有相同名称非虚函数(参数列表可以不同)

子类若有和父类相同的函数,那么,这个类将会隐藏其父类的方法。除非你在调用的时候,强制转换成父类类型。在子类和父类之间尝试做类似重载的调用时不能成功的。

重写(覆盖):

虚函数表中虚函数地址的覆盖

具体见:静态绑定 动态绑定 虚函数 重写(覆盖):

   

总结如下:

   

1 成员函数重载特征:

a 相同的范围(在同一个类中)

   

b 函数名字相同

   

c 参数不同

   

d virtual关键字可有可无

   

2 重写(覆盖)是指派生类函数覆盖基类函数,特征是:

   

a 不同的范围,分别位于基类和派生类中

   

b 函数的名字相同

   

c 参数相同

   

d 基类函数必须有virtual关键字

   

3 重定义(隐藏)是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

   

a 如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。

   

b 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏。否则就是重写了。

posted @ 2022-08-30 21:15  atomxing  阅读(117)  评论(0编辑  收藏  举报