C++中重载、重写、重定义的区别

本文围绕C++编程展开,介绍了函数重载、重写(覆写)和重定义(隐藏)的概念及规则。函数重载要求同名但参数列表不同;函数重写是子类覆盖父类虚函数;函数重定义指子类函数屏蔽父类同名函数,还给出了相应规则。

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

函数重载:

重载是指相同的函数名,不同的参数列表(与返回值无关)

1、函数的名字必须相同
2、函数的参数列表必须不同,与参数列表的顺序无关
3、返回值类型可以不同

函数重写(覆写)

覆写是指子类的成员函数覆盖了父类的虚函数

1、不同的范围,分别位于基类和派生类中
2、函数名相同
3、参数列表相同
4、返回值相同
5、基类函数必须有virtual关键字
6、只有虚方法或抽象方法才能够被覆写

重定义(隐藏)

函数重定义指的是子类的成员函数屏蔽了与其同名的父类函数

1、如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。

2、如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏。否则就是重写。

代码示例:

#include <iostream>
using namespace std;

class Base {
public:
	// 普通成员函数
	void func() { 
		cout << "it's Base func()" << endl; 
	}	
	// 函数重载 func()
	void func(int a) { 
		cout << "it's Base func(), a = " << a << endl;
	} 
	// 虚函数
	virtual void func2() { 
		cout << "it's Base func2()" << endl; 
	}	
};


class Derived : public Base {
public:
	// 覆写父类的虚函数
	// 也是对父类的func2()进行重定义,只不过带有virtual关键字
	void func2() { 
		cout << "it's child 2" << endl;
	}	
	// 重定义 : 对于父类的func()
	void func(int a) {
		cout << "it's child func(), a = " << a << endl;
	}
};

int main() {
	Base* b;	//	父类指针
	Derived d;	//	子类对象

	b = &d;
	b->func();		// Base func()		子类继承了父类的public接口,因此可以访问父类接口
	b->func(100);	// Base func(2)		子类继承了父类的public接口,因此可以访问父类接口
	b->func2();		// Derived func2()	多态

	d.func(100);	// Derived func()	子类对象的接口
	d.func2();		// Derived func2()  子类对象的接口
	return 0;
}

代码输出:

it's Base func()
it's Base func(), a = 100
it's child 2
it's child func(), a = 100
it's child 2

谢谢阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值