C++函数重载和重写

目录 

函数重载

函数重写


函数重载

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

函数重载条件:

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

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

C++中,函数重载(Overloading)函数重写(Overriding)是两个面向对象编程中的重要概念,它们分别用于不同的场景,并且具有不同的实现机制。 ### 函数重载(Overloading) 函数重载是指在同一个作用域内定义多个具有相同名称但参数列表不同的函数。编译器会根据调用时传递的参数数量类型来选择正确的函数函数重载通常用于实现相似但参数不同的操作。重载可以提高代码的可读性灵活性,使得同一个函数名可以用于不同类型或数量的参数 [^2]。 #### 函数重载示例 ```cpp #include <iostream> void print(int i) { std::cout << "Integer: " << i << std::endl; } void print(double d) { std::cout << "Double: " << d << std::endl; } void print(const std::string& s) { std::cout << "String: " << s << std::endl; } int main() { print(10); // 调用 void print(int) print(3.14); // 调用 void print(double) print("Hello"); // 调用 void print(const std::string&) return 0; } ``` ### 函数重写(Overriding) 函数重写是指派生类重新定义基类中的虚函数,以提供不同的实现。重写是实现多态性的关键机制之一。要进行函数重写,需要满足以下条件: - 基类中的函数必须声明为虚函数。 - 派生类中的函数必须使用相同的函数名、参数列表返回类型。 - 派生类中的函数必须声明为虚函数,尽管不是必需的,但是最好使用 `override` 关键字进行显式标记,以确保它是对基类虚函数重写 [^4]。 #### 函数重写示例 ```cpp #include <iostream> class Base { public: virtual void show() { std::cout << "Base class show function" << std::endl; } }; class Derived : public Base { public: void show() override { std::cout << "Derived class show function" << std::endl; } }; int main() { Base base; Derived derived; base.show(); // 调用 Base::show() derived.show(); // 调用 Derived::show() Base* basePtr = &derived; basePtr->show(); // 通过基类指针调用 Derived::show(),体现多态性 return 0; } ``` ### 函数重载函数重写的区别 | 特性 | 函数重载(Overloading) | 函数重写(Overriding) | |--------------------|--------------------------------------------|-------------------------------------------------| | 定义位置 | 同一个类或作用域内 | 不同类中(基类与派生类) | | 函数名 | 相同 | 相同 | | 参数列表 | 必须不同 | 必须相同 | | 返回类型 | 可以不同 | 必须相同 | | 访问权限 | 无特殊要求 | 基类函数必须为虚函数 | | 多态性 | 不涉及多态 | 是实现运行时多态的关键 | | 关键字 | 无 | 通常使用 `override` 关键字 | ### 使用场景 - **函数重载**:适用于需要为不同的参数类型或数量提供相同功能的函数,提高代码的可读性灵活性。 - **函数重写**:适用于需要在派生类中提供基类虚函数的不同实现,支持多态行为,使得程序能够更加灵活地处理对象类型 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值