最近天气回暖,正是学习的好时候,同学们加油!喜欢的朋友点个关注吧!蟹蟹!
目录
一、C++多态
1、多态的理解
在C++中,多态性并不仅限于重载函数,它实际上有两种主要形式:编译时多态(静态多态)和运行时多态(动态多态)。其中,函数重载是编译时多态的一种形式,而另一种形式是虚函数和继承导致的运行时多态。
(1)、编译时多态(静态多态)
·函数重载:在同一作用域内,允许定义多个名称相同但参数列表不同的函数,编译器根据函数调用的参数类型或个数选择合适的函数。这种多态性是在编译时确定的,因此也称为静态多态。
(2)、运行时多态(动态多态)
·虚函数和继承:通过基类指针或引用调用派生类对象的方法时,实际执行的是派生类的方法,而不是基类的方法。这种多态性是在运行时确定的,因此也称为动态多态。
二、函数重载的引出
在我们的现实生活中,我们经常能碰到一些汉字在不同场景下有不同发音的情况,如:“重”这个字,它的发音就有chong和zhong,我们会根据不同的场景需求给它赋不同的发音,比如我们会说“你怎么写了那么多重复的代码呀!”,这里面的读音就是chong
但是在C语言中我们知道,假设我们要实现传入不同的一个参数个数和参数类型,我们只能定义不同函数来实现,如下代码:
void fun(int a){
printf("a = %d\n",a);
}
void fun2(int a,int b){
printf("a = %d\tb = %d\n",a,b);
}
void fun3(int a,int b,int c){
printf("a = %d\tb = %d\tc = %d\n",a,b);
}
这样就会造成一个代码复用性差,而且因为每个函数名都需不同,所以就容易造成一个函数命名冲突的一个情况,
在C++中,函数重载就可以解决这个问题,如下代码:
void fun(int a){
printf("a = %d\n",a);
}
void fun(int a,int b){
printf("a = %d\tb = %d\n",a,b);
}
void fun(int a,int b,int c){
printf("a = %d\tb = %d\tc = %d\n",a,b);
}
在上述代码中,函数名相同,但是每个函数的参数个数,参数类型,参数顺序不同,这也就是我们的函数重载。当我们给fun函数传入参数时,它会自动匹配相对应的函数去进行调用,也就避免了给每个函数都取别名的情况。
实现函数重载的条件:同一个作用域,参数不同,参数类型不同,参数顺序不同。
但是注意:我们的函数返回值类型不能作为函数重载依据,这个是为什么呢?当编译器能从上下文中确定唯一的函数时,如ret = func(),这个当然是没有问题的。然而,我们在编写程序过程中可以忽略它的返回值,那么这个时候,一个函数为void func(int x),另一个为int func(int x);当我们直接调用func(10),这个时候编译器就不能确定调用哪个函数了,所以在C++中禁止使用返回值作为重载条件。
三、函数重载实现的原理
编译器为了实现函数重载,也是做了一些幕后工作,编译器用不同的参数类型来修饰不同的函数名,比如void fun();编译器可能会将函数名修饰成func,当碰到void func(int x),编译器将函数名修饰为funcint,同理,当编译器碰到void func(int x,char y),编译器就可能将函数名修饰为funcintchar。
void func(){}
void func(int x){}
void func(int x,char y){}
以上三个函数在Linux下生成的编译之后的函数名为:
_Z4funcv //v 代表 void,无参数
_Z4funci //i 代表参数为 int 类型
_Z4funcic //i 代表第一个参数为 int 类型,第二个参数为 char 类型