重载,重写与隐藏的区别?

本文详细介绍了C++中的重载、重写和隐藏的概念。重载发生在同一作用域内,主要通过参数列表区分不同的函数;重写针对虚函数,要求子类函数与父类函数同名同参数列表;隐藏则指子类同名函数屏蔽父类同名函数,参数列表不同构成隐藏。重载是静态多态,重写则是动态多态。

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

重载

重载最重要的一点是,两个重载的函数必须在同一作用域内(同一大括号内)
1.只要参数列表不相同就算重载(参数列表中只要变量的个数或者变量的类型不同都算参数列表不同)
2.重载不关心返回值类型是否相同,但是若只有返回值类型不同而参数列表是相同的,则不能叫做重载(编译器也不会允许这样写)

#include <iostream>
#include <vector>

using namespace std;

class Father {
public:
	void fun() {
		cout << "fun" << endl;
	}
	void fun(int i) {
		cout << i << endl;
	}
};
int main(){
    Father f;
    f.fun();
    f.fun(3);
}

重写

重写的是针对于虚函数来说的,并且子类中重写的函数必须与父类中的函数同名,同参数列表,二者缺一不可

即在子类中,将虚函数名与参数列表都相同的函数重写其方法体

并且使用动态多态必须要用到对象指针,不能用对象本身

#include <iostream>
#include <vector>

using namespace std;

class Father {
public:
	virtual void fun() {
		cout << "I'm Father" << endl;
	}
};

class Son :public Father {
public:
	//这是 重写
	//即在子类中,将虚函数名与参数列表都相同的函数重写其方法体
	void fun() {
		cout << "I'm Son" << endl;
	}
};

int main(){
    Father* f = new Father();
    f->fun();
    
    f = new Son();
    f->fun();
}

面向对象中的多态特性就是由重写重载所构成的

重载静态多态,而重写动态多态

隐藏

隐藏指的是子类中的同名函数屏蔽了父类中的同名函数,根据参数列表是否相同分为两种情况

(1)如果参数列表不同时,则无论有无virtual关键字,都构成隐藏

(注意构成重写的条件:子类中重写父类的虚函数必须同名,同参数列表。当函数名相同但是参数列表不同时,不构成重写,而构成隐藏)

#include <iostream>
#include <vector>

using namespace std;

class Father {
public:
	virtual void fun() {
		cout << "I'm Father" << endl;
	}
};

class Son : public Father {
public:
    //子类与父类同名函数的参数列表不同,则不管父类的同名函数是否是虚函数,都构成隐藏
	void fun(int i) {
		cout << i << endl;
	}
};

int main(){
    Father f;
    f.fun();
    
    Son s;
    s.fun(3);
}

(2)如果参数列表相同,则无virtual关键字时也是构成隐藏(如果有virtual关键字并且函数名与参数列表都相同的情况下构成的是重写)

#include <iostream>
#include <vector>

using namespace std;

class Father {
public:
	void fun() {
		cout << "I'm Father" << endl;
	}
};

class Son : public Father {
public:
    //子类与父类函数名相同并且参数列表相同,但是父类中的函数不是虚函数,则构成隐藏而不是重写
	void fun(int i) {
		cout << i << endl;
	}
};

int main(){
    Father f;
    f.fun();
    
    Son s;
    s.fun(3);
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值