C++中重载、重定义、重写概念的区分

本文详细解释了C++中的重载、重写和重定义概念,并通过实例对比了它们之间的区别,有助于理解C++中函数的多种使用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在C++中我们经常会遇见“重载、重定义、重写”的概念,三个概念名字很像,很容易混淆,今天我们对三者进行一个区分。

1.重载(overload)

函数重载是函数的一种特殊情况,其特点是:

(1)在同一作用域(全局作用域、局部作用域、类作用域);

(2)函数名相同;

(3)形参列表(参数个数、参数类型、参数顺序)必须不同;

(4)返回值可以不同;

(5)virtual关键字可有可无。

举例:

//eg1:
int Add(int left,int right)
char Add(char left,char right)
double Add(double left,double right)

//eg2:
void Funtext(int a)
void Futext(int a,int b)
void Funtext(int a,char b)
void Funtext(char a,int b)

下面,我们看一看这种情况能否构成重载?

void Fun()
{

}
void Fun()
{
	return 0;
}

根据上面我们所说的重载的特点,看起来这两个函数好像还可以构成重载,但实际上是不可以的,原因是:仅仅返回值类型不同,不能构成重载!

2.重写(覆盖)

覆盖是C++多态的实现基础,指派生类重新定义基类的虚函数。其特点是:

(1)在不同的作用域中(分别在基类和派生类中);

(2)函数名相同;

(3)参数相同;

(4)返回值类型相同(协变例外:基类中的虚函数返回Base*,派生类中返回Derived*);

(5)基类函数必须有virtual关键字,派生类可有可无(因为派生类继承基类后就会有该关键字),但基类不能有static关键字;

(6)访问修饰符可以不同(例如基类virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的)。

举例:

class Base{
public:
	virtual int Fun(int num1, int num2)
	{
		cout << "Base" << endl;
		return 0;
	}
};
class Derived :public Base{
public:
	virtual int Fun(int num1, int num2)
	{
		cout << "test" << endl;
		return 1;
	}
};
//协变
class Father{
public:
	virtual const Base& getClass() = 0;
};
class Child{
	virtual const Derived& getClass()
	{
		Derived ret;
		return ret;
	}
};

3.重定义(隐藏)

在继承体系中,子类和父类中有同名成员,子类成员将屏蔽父类对成员的直接访问。(在子类成员中,可以使用基类: :基类成员访问)。重定义的特点如下:

(1)在不同的作用域中(分别在基类和派生类中);

(2)函数名相同;

(3)返回值可以不同;

(4)在基类和派生类中,只要不构成重写就是重定义(即:参数相同时:基类没有关键字virtual,基类的函数被隐藏;参数不同时:无论基类有无关键字virtual,基类函数都被隐藏)。

举例:

class Base{
public:
	virtual int Add(int a, int b)
	{
		return a + b;
	}
	void Print()
	{
		cout << "Base" << endl;
	}
};
class Devired :public Base{
public:
	virtual int Add(int a, int b, int c)
	{
		return a + b + c;
	}
	void Print()
	{
		cout << "Devired" << endl;
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值