C++ 中重载、重写(覆盖)、重定义(隐藏)的区别

本文详细介绍了C++中的重载、重写(覆盖)和重定义(隐藏)的概念。重载发生在同一作用域内,通过参数的不同实现;重写在继承关系中,子类函数名和参数与父类相同,实现动态多态;重定义则是子类中相同函数名但参数不同的情况,导致父类函数被隐藏。

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

(1)重载

  • 重载是指在同一个作用域内,两个函数的函数名可以相同,但是参数不能完全相同
  • 可以是参数类型不同,也可以是参数个数不同
  • 返回值不影响重载,即不同返回值的函数,其他都相同则不能重载
  • 重载的实现原理:编译器在编译函数时,会根据函数名以及参数类型和个数对函数重命名
int fun(int a) {
	return a;
}

void fun(int a, int b) {	// 函数重载
	cout << a*b << endl;
}

(2)重写,也叫覆盖

  • 重写是指在继承关系中,子类中定义了一个与父类函数名和参数相同的函数
  • 函数位于不同的范围,分别位于基类和派生类中
  • 函数名必须相同
  • 参数必须相同
  • 返回值可以不相同,但是必须是父子关系的指针或引用
  • 基类函数必须有virtual关键字
  • 通过重写可以实现动态多态

(3)重定义(隐藏)

  • 指的是在继承关系中,子类实现了一个和父类名字一样的函数,这样子类的函数就把父类的函数屏蔽了
  • 如果派生类中的函数与基类的函数名相同但是参数不同,此时,不管基类中是否有virtual关键字修饰,基类的函数被隐藏。
  • 如果派生类中的函数与基类的函数名相同参数也相同,此时,如果基类中无virtual关键字修饰,基类的函数被隐藏。
struct Base {
	int f1();
};

struct Child : Base {
	int f1(int a);  // 隐藏基类的f1()
};

// 调用
Base b; Child c;
b.f1();   // 正确:访问Base中的成员
c.f1(10);   // 正确:访问Child中的成员
c.f1();   // 错误:参数列表为空的f1被隐藏了,无法访问
c.Base::f1();   // 正确:访问Base中的f1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值