`
isiqi
  • 浏览: 16344155 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

函数重载、覆盖与隐藏

 
阅读更多
在C++语言中,函数扮演着很重要的角色,不管面向过程设计,还是基于对象设计;不管是面向对象编程,还是基于泛型编程,函数都可以随处而见。在谈论C++中的函数重载、覆盖和隐藏之前,先回顾下函数的基础知识。
函数的声明包括函数的返回值类型,函数名称,参数列表(参数的类型、参数的个数、参数的顺序)。例如,声明一个两个整数之和的函数,int iAdd(int iNum1,int iNum2);而函数的定义可以理解为对函数功能的详尽而准确的解说,通俗点,就是实现函数“how to do?”的效能。两个整数之和函数的定义如下:
int iAdd(int iNum1,int iNum2)
{
return (iNum1+iNum2);
}
仔细观察函数的声明和定义,我们不难发现,函数的定义就是除掉函数声明后面的分号,换之成大括号,在大括号里面实现函数的功能。虽然在某些情况下,可以容许不对函数进行声明,只需要对函数定义,就能调用函数了。但是,强烈建议养成先声明函数,然后再定义函数,最后在调用函数的良好习惯。关于函数的基础知识,暂时论述到这。
现在,进入本文的主题。函数重载(function overload),它是在同一可访问区域内部声明具有几个不同参数列(参数的类型、参数的个数,参数的顺序)的相同函数名称的一种机制,函数的调用是根据不同的参数类型和最佳匹配原则确定最终使用那个函数。函数覆盖(function override)是在派生类中完全一致性地声明了父类中的函数,区别在于函数定义中的大括号之间的内容可以不同,并且该函数在父类中有关键字virtual标识;函数隐藏(function hide)是指在派生类中函数与父类函数完全一致,但是在父类中该函数没有关键字virtual标识,或者是指在派生类中函数与父类的函数名相同,参数列表不一样,父类中的该函数可有也可无关键字virtual标识。
函数重载的特征:相同的范围内(在同一个类中),函数的名称相同,参数列表不同,virtual关键字可有可无;函数覆盖的特征:在不同的范围内(父类与派生类),函数的名字相同,参数列表相同,父类函数必须有关键字virtual;函数隐藏的特征:在不同范围内(父类与派生类),函数的名字相同,参数列表相同,但是父类函数没有关键字virtual或者,参数列表不相同,父类函数中virtual关键字可有可无。为了直观地理解,请看下面的代码。
#include<iostream>
using namespace std;
class A
{
public:
void print(int iNum)
{
cout<<"在类A中,参数类型是整型"<<endl;
}
void print(float fNum)
{
cout<<"在类A中,参数类型是单精度浮点型"<<endl;
}
virtual void print(void)
{
cout<<"在类A中,参数类型是空类型"<<endl;
}
};
class B:public A
{
public:
void print( void)
{
cout<<"在类B中,参数类型是空类型"<<endl;
}

void print(int iNum)
{
cout<<"在类B中,参数类型是整型"<<endl;
}
};
int main()
{
A a;
B b;
//函数的重载
a.print();
a.print(1);
a.print(1.0f);
//函数的覆盖
b.print();
//函数的隐藏
b.print(1);
return 0;
}
运行结果是:
在类A中,参数类型是空类型
在类A中,参数类型是整型
在类A中,参数类型是单精度浮点型
在类B中,参数类型是空类型
在类B中,参数类型是整型
通过上述代码和运行的结果,简明地知道了函数重载,覆盖和隐藏。恰当里利用这些特性,可以编写出更加有效、清晰和精简的代码。


分享到:
评论

相关推荐

    C++成员函数的重载、覆盖与隐藏

    文件详细描述了C++成员函数的重载、覆盖与隐藏技术,对于初学C++的人员很有帮准,也是我们程序猿参考、学习的重要资料。

    重载、覆盖、多态与函数隐藏

    隐藏与覆盖不同,因为覆盖要求派生类中的函数与父类中的函数有完全相同的签名。 在提供的代码示例中,我们可以看到派生类如何通过重载、覆盖和隐藏来改变函数的行为。例如,在第一个示例中,派生类`Derive`定义了一...

    C++全套学习课件函数的覆盖、隐藏和重载.pdf

    在C++编程语言中,函数的覆盖(Overriding)、隐藏...总之,理解并正确使用C++中的函数重载、覆盖和隐藏是编写高效、灵活代码的基础。在设计类层次结构时,要充分考虑这些特性,以实现最佳的代码复用和可扩展性。

    重载、覆盖和隐藏

    同时,`Derived`类的无参`func()`函数重载了`Base`类的`func(float x)`函数,尽管这两个函数在`Base`类中不可重载。最后,`Derived`类的`show()`函数隐藏了`Base`类的同名函数,因为`Base`类的`show()`函数没有`...

    C++ 中函数重载、覆盖与隐藏详解

    C++ 中函数重载、覆盖与隐藏详解 函数重载(function overload)是C++语言中的一种机制,它允许在同一个可访问区域内部声明具有相同函数名称但具有不同参数列(参数的类型、参数的个数、参数的顺序)的多个函数。...

    SigalHu#MyBlog#类中成员函数的重载、覆盖与隐藏[转]1

    原文:C++类成员函数的 重载、覆盖和隐藏区别重载成员函数被重载的特征:相同的范围(在同一个类中)函数名字相同参数不同virtual 关键字可有可无void s

    类成员函数的重载、覆盖与隐藏之间的区别总结

    答案:a.成员函数被重载的特征:(1)相同的范围...此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键

    成员函数的重载、覆盖与隐藏详细解析

    1 重载与覆盖成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生...

    C++中的函数重载、覆盖与隐藏

    在谈论C++中的函数重载、覆盖和隐藏之前,先回顾下函数的基础知识。  函数的声明包括函数的返回值类型,函数名称,参数列表(参数的类型、参数的个数、参数的顺序)。例如,声明一个两个整数之和的函数,int iAdd...

    c++ 重载、覆盖、重写

    #### 六、隐藏与重载、重写的区别 1. **范围:** 隐藏发生在不同的类之间,而重载发生在同一个类中。 2. **参数列表:** 隐藏允许参数列表不同,而重载要求参数列表必须不同。 3. **虚函数:** 对于隐藏,无论基类中...

    C++的重载、隐藏、覆盖规则

    在C++编程语言中,重载(Overloading)、隐藏(Hiding)和覆盖(Overriding)是三个重要的概念,它们涉及到函数和运算符在不同情况下的多态性表现。理解并掌握这些规则对于编写高效、可维护的代码至关重要。 ### 1....

    C++中重载、重写(覆盖)和隐藏的区别实例分析

    隐藏与虚函数无关,即使基类函数是虚的,也会发生隐藏。 总结: - 重载用于在同一作用域内提供多个同名但行为不同的函数。 - 重写用于在派生类中改变基类虚函数的行为,实现多态性。 - 隐藏则是在派生类中引入新的...

    对比C++与Java中的函数重载、覆盖、和隐藏

     C++中的函数的重载要求的是 函数名相同 参数列表必须不同 返回值类型可以相同也可以不相同;只有参数列表不相同,在函数调用时,编译环境才能准确抉择调用的是哪个函数。例如:void display();void display...

    java中重载、覆盖和隐藏三者的区别分析

    **隐藏与覆盖的区别** 当子类对象被强制转换为父类类型时,对于隐藏的属性,会访问父类中的属性,而对于覆盖的方法,会根据对象的实际类型调用子类的方法,这是由于RTTI的作用。隐藏不受RTTI约束,因此,隐藏是静态...

    C++基类指针和派生类指针之间的转换方法讲解

    函数重载、函数隐藏、函数覆盖 函数重载只会发生在同作用域中(或同一个类中),函数名称相同,但参数类型或参数个数不同。 函数重载不能通过函数的返回类型来区分,因为在函数返回之前我们并不知道函数的返回类型。...

Global site tag (gtag.js) - Google Analytics