重载、覆盖、隐藏的区别

在C++中有三种概念,重载、覆盖、隐藏,这三种概念比较相似,但其中仍旧有很大区别!
重载:
我们经常使用函数的重载,最简单的重载,在我们使用一些排序算法时,如果数据类型发生改变,比如开始我们是根据int型数组来写的排序算法,但是当我们想对double类型数组也使用时,我们在没学习类模板与函数模板前会将刚才写的int型数据的排序算法复制一遍,然后将相关参数改为double型。
这样一来,在调用排序算法时,如果参数时int型,就会调用int的排序函数,参数是double型,就会调用double的排序函数,这就属于函数的重载。

所以重载函数的特性:
(1)在同一个作用域中
(2)函数名字相同
(3)形参列表不同(包括不同类型形参先后顺序不同)
(4)virtual关键字可有可无

class A
{
public:
    void Func(int a,int b) {cout<<“Func(int,int)”<<endl;}
    void Func(int a) {cout<<“Func(int)”<<endl;}
};

int main()
{
    A a;
    a.Func(5);
    a.Func(5,7);
    return 0;
}

在这里插入图片描述
这时在调用函数名相同的函数时编译器会自己根据形参列表的最佳匹配来调用函数,上面的代码结果就是Func(int)。

注意:返回值类型不能作为函数重载依据。

覆盖:
覆盖的特点:分别位于基类和派生类中,同名同参,并且基类的函数被virtual所修饰。

这时调用该函数时会通过虚表调用的是派生类中的函数,基类的函数被覆盖。

例:

class A
{
public:
	virtual void Func(){cout<<"AFunc()"<<endl;}
};
class B:public A
{
public:
	void Func(){cout<<"BFunc()"<<endl;}
};
int main()
{
	A a;
	B b;
	a.Func();
	b.Func();
	return 0;
}

在这里插入图片描述
这时b调用的就是类B中的Func()函数,并不会调用从A中继承的Func()函数的。

隐藏:
隐藏的特点:分别位于基类和派生类中
a.同名不同参
b.同名同参且基类函数未被virtual所修饰

例:
同名不同参

class A
{
public:
	 void Func(int a) { cout << "AFunc(a)" << endl; }
};
class B :public A
{
public:
	void Func() { cout << "BFunc()" << endl; }
};
int main()
{
	B b;
	A a;
	a.Func(8);
	b.Func();
	return 0;
}

在这里插入图片描述
同名同参且基类函数未被virtual所修饰

class A
{
public:
	void Func() { cout << "AFunc(a)" << endl; }
};
class B :public A
{
public:
	void Func() { cout << "BFunc()" << endl; }
};
int main()
{
	B b;
	A a;
	a.Func();
	b.Func();
	return 0;
}

在这里插入图片描述
覆盖和隐藏的含义令人感觉很模糊,需要多加注意。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值