C++多态与虚拟:函数重载(Function Overloading)

简介: 重载(Overloading)是C++中的一个特性,允许不同函数实体共享同一名称但通过参数差异来区分。例如,在类`CPoint`中,有两个成员函数`x()`,一个返回`float`,另一个是设置`float`值。通过函数重载,我们可以为不同数据类型(如`int`、`float`、`double`)定义同名函数`Add`,编译器会根据传入参数自动选择正确实现。不过,仅返回类型不同而参数相同的函数不能重载,这在编译时会导致错误。重载适用于成员和全局函数,而模板是另一种处理类型多样性的方式,将在后续讨论中介绍。

 重载(Overloading):所谓重载是指不同的函数实体共用一个函数名称。例如以下代码所提到的CPoint之中,有两个member functions的名称同为x():

1 class CPoint{

2

3 public:

4     float x();

5     void x(float xval);

6

7 };

其两个member functions实现代码如下:

1 float CPoint::x(){return x;}

2 void  CPoint::x(float xval){_x=xval;}

  函数名称相同,但参数不同(个数不同,型别也不同),实现代码也不相同。C++之所以有function overloading的机制,是为了解决因为数据类型不同而需要设计多个算法相同,但函数名不同的函数代码的问题。举个例子,加法就是加法,如果为了int、float、double、long....各设计出对应的AddInt()、AddFloat()、AddDouble()、AddLong()...等加法函数,我们会觉得很烦锁,不漂亮。如果能够把它们全部都叫做Add(),而我们不管对哪种数据类型做加法运算,都呼叫Add()就好,那么就运算层面来看就清爽多了。至于底层机制,则由编译器根据Add()所获得的参数型别,决定真正该唤起哪一个Add()函数实体。于是,以加法为例,我们可以设计以下四个同名函数:

1 int     Add(int a,int,b);

2 long    Add(long a,long b);

3 double  Add(double a, double b);

4 float   Add(float a,float b);

  并这样使用之:

1      int    i=Add(3,5);

2      long   l=Add(3L,5L);

3      double d=Add(3.1415926,5.1615926);

4      float  f=Add(3.14,5.14);

  Function overloading 适用于class member functions (如先前的CPoint::x()),也适用于一般的global functions(如上术的Add()).

      Function overloading 无法适用于函数名称相同,参数也完全相同,只有返回值不同的情况。这种情况将无法通过编译,会出现报错提示:

  error C2556: 'Add' : overloaded functions only differ by return type

  我们已经看到了,所谓的function overloading 只不过是让诸多的函数实体可以采用相同的函数名称,事实上你还是要编写好几份不同(但逻辑十分类式)的函数实现代码。为了能够解决因为数据类型不同而需要设计多个算法相同,但函数名不同的函数代码的问题,比较好的做法是把参数看作只有一种类型。C++ Template 可以办到这一点,我们将在往后的文章来谈这个非常棒的主题。

相关文章
|
2天前
|
存储 编译器 C++
【C++】深度解剖多态(下)
【C++】深度解剖多态(下)
8 1
【C++】深度解剖多态(下)
|
10天前
|
存储 编译器 C++
|
2天前
|
Java 编译器 C++
【C++】深度解剖多态(上)
【C++】深度解剖多态(上)
13 2
|
2天前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
|
10天前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `<`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
12天前
|
程序员 C++
【C++】揭开C++多态的神秘面纱
【C++】揭开C++多态的神秘面纱
|
8天前
|
编译器 程序员 C++
【C++高阶】掌握C++多态:探索代码的动态之美
【C++高阶】掌握C++多态:探索代码的动态之美
13 0
|
10天前
|
算法 编译器 C++
C++基础知识(三:哑元和内联函数和函数重载)
在C++编程中,"哑元"这个术语虽然不常用,但可以理解为在函数定义或调用中使用的没有实际功能、仅作为占位符的参数。这种做法多见于模板编程或者为了匹配函数签名等场景。例如,在实现某些通用算法时,可能需要一个特定数量的参数来满足编译器要求,即使在特定情况下某些参数并不参与计算,这些参数就可以被视为哑元。
|
10天前
|
存储 编译器 C++
C++基础知识(七:多态)
多态是面向对象编程的四大基本原则之一,它让程序能够以统一的接口处理不同的对象类型,从而实现了接口与实现分离,提高了代码的灵活性和复用性。多态主要体现在两个层面:静态多态(编译时多态,如函数重载)和动态多态(运行时多态,主要通过虚函数实现)。
|
17天前
|
编译器 C++ p3c
【c++】多态
【c++】多态
8 0

热门文章

最新文章