类中的同名函数关系,重载,覆盖/重写,隐藏

Posted Poffmd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类中的同名函数关系,重载,覆盖/重写,隐藏相关的知识,希望对你有一定的参考价值。

对于类中的同名函数,重载,覆盖/重写,隐藏

C++特性,不是类亦可以实现重载,与virtual无关联。
重载:同一类域抑或无类域,相同函数名,不同形参个数或类型;由形参决定调用哪个函数实现。同类域同名函数相同形参会引起编译错误。

 

virtual修饰函数需要相同的返回值与形参类型,多态特性则需要该修饰符才能体现。

重写/覆盖:基类与派生类关系,同样的函数名,相同形参个数与类型,基类函数有virtual修饰;派生类执行派生类函数而不是基类函数实现,指针与引用的多态体现出来了,即基类指针或引用可根据指向实际子类的类型来执行对应派生类实现,如要执行基类函数仍可通过类域指定。

 

/**************************************************************/

隐藏:基类与派生类关系,同样的函数名,相同形参个数与类型,基类函数无virtual修饰;未指定类域,由变量类型确定用哪个函数实现。

即使基类指针指向派生类,调用同名函数仍然是调用基类函数;因为无virtual修饰是无法体现多态的。

 

备注:
基类与派生类关系,相同函数名,不同形参个数与类型,基类函数有/无virtual修饰;编译器根据实参确定调用哪个类的实现,如果当前类变量类型未声明则引起编译错误。
1.派生类变量(包括指针与引用)编译器会找当前派生类声明,基类的声明无效,子类无法继承。
2.基类变量 (包括指针与引用)编译器会找基类声明,子类声明无效,多态无法体现;就算基类指针指向子类,如果基类未声明编译仍然出错。

 

故所谓隐藏只是一个说法,并非规则。了解C++编译器,都知道编译器通过参数识别,然后找类中的声明,有则调用,无则报错。

Edit by yexf

 

以上是关于类中的同名函数关系,重载,覆盖/重写,隐藏的主要内容,如果未能解决你的问题,请参考以下文章

C++之重载覆盖和隐藏

函数重载和覆盖(重写)的区别

java 重载和重写的区别

C++ 类的多态二(函数重载--函数重写--函数重定义)

重写和重载

Java中的Overload(重载)与Override(重写覆盖)