栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++函数重载和重写

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++函数重载和重写

目录 

函数重载

函数重写


函数重载

作用:函数名可以相同,提高复用性

函数重载条件:

1.同一个作用域下

2.函数名称相同

3.函数参数类型不同或者个数不同或者顺序不同

注意事项:

1.引用作为函数重载条件

#include
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
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 
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
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)。虚表是和类对应的,虚指针是和对象对应的。

当子类重写父类的虚函数的时候,会将从父类中继承来的虚表中父类原本的虚函数覆盖掉替换成子类的虚函数地址,从而实现多态

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1029302.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号