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

重载

  • 两个函数必须在同一作用域。
  • 函数名必须相同。
  • 函数的参数列表必须不同(参数的个数、次序、类型)。
  • 与返回值类型无关。
int add(int a, int b){
	cout << "int_int_int" << endl;
	return a + b;
}

double add(double a, double b){
	cout << "double_double_double" << endl;
	return a + b;
}

int add(int a, double b){
	cout << "int_int_double" << endl;
	return a + b;
}

int main(){
	add(1, 2);
	add(1.0, 2.0);
	add(1, 2.0);
	return 0;
}

上面代码中的三个“add”函数就构成重载。

重定义(隐藏)

  • 不在同一作用域,必须在继承体系中。
  • 基类与派生类具有相同名称的成员(成员函数、成员变量)。
  • 与参数列表、返回值类型无关。
class A{
public:
	void print(){
		cout << "A::print()" << endl;
	}

	int _a1;
	int _a2;
};
class B:public A{
public:
	void print(int x){
		cout << "B::print()" << endl;
	}

	int _a2;
};

int main(){
	B b;
	b.print(2); //B::print()
	b.A::print();//A:;print()
	return 0;
}

在这里插入图片描述

上面继承体系代码中的成员函数print函数以及成员变量_a2 构成重定义(隐藏),派生类想要访问基类的成员可以通过作用域限定符。

重写(覆盖)

  • 不在同一作用域,必须是在构成多态的继承体系中虚函数。
  • 基类与派生类具有相同名称的成员(成员函数、成员变量)。
  • 参数列表、返回值类型也必须相同。
class A{
public:
	virtual void print(){
		cout << "A::print()" << endl;
	}

	int _a1;
};
class B :public A{
public:
	virtual void print(){
		cout << "B::print()" << endl;
	}

	int _b;
};

void fun(A& a){
	a.print();
}
int main(){
	A a;
	B b;
	
	fun(a);
	fun(b);
	return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值