目录
函数重载
作用:函数名可以相同,提高复用性
函数重载条件:
1.同一个作用域下
2.函数名称相同
3.函数参数类型不同或者个数不同或者顺序不同
注意事项:
1.引用作为函数重载条件
#include<iostream>
using namespace std;
void fun(int &a) {
cout << "1" << endl;
}
void fun(const int &a) {
cout << "2" << endl;
}
int main()
{
fun(1);//调用const引用
int a;
fun(a);//调用非const引用
return 0;
}
2.函数重载碰到默认函数
#include<iostream>
using namespace std;
void fun(int a) {
cout << "1" << endl;
}
void fun(int a,int b=10) {
cout << "2" << endl;
}
int main()
{
int a;
//fun(a);//碰到默认参数有歧义需要避免
return 0;
}
函数重载实现原理
C++利用命名倾轧(name mangling)技术,来改名函数名,区分参数不同的同名函数。命名倾轧是在编译阶段完成的。
#include<iostream>
using namespace std;
int func(int a,double b)
{
return ((a)+(b));
}
int func(double a,float b)
{
return ((a)+(b));
}
int func(float a,int b)
{
return ((a)+(b));
}
int main()
{
return 0;
}
d代表double,f代表float,i代表int,加上参数首字母以区分同名函数
函数重写
函数重写是父类和子类的关系,是垂直关系
重载是同一个作用域下不同方法之间的关系,是水平关系
重写条件:
1.重写的函数和被重写的函数必须都为virtual函数,而且分别位于基类和派生类中
2.重写的函数和倍重写的函数,函数名和函数参数必须完全一致
3.重写的函数和被重写的函数,返回值相同,或者返回指针或引用,并且派生类虚函数返回的指针或引用的类型是基类中被替换的虚函数返回的指针或引用类型的类型
案例:
#include<iostream>
using namespace std;
class A {
public:
virtual void fun() {
cout << "A" << endl;
}
};
class B :public A {
public:
virtual void fun() {
cout << "B" << endl;
}
};
int main()
{
A* p = new B();
p->fun();
return 0;
}
函数重写实现原理
存在虚函数的类中都有一个一维的虚函数表叫做虚表(vftable),类的对象有一个指向虚表开始的虚指针(vfpoint)。虚表是和类对应的,虚指针是和对象对应的。
当子类重写父类的虚函数的时候,会将从父类中继承来的虚表中父类原本的虚函数覆盖掉替换成子类的虚函数地址,从而实现多态