C++重载,覆盖,隐藏

一、重载
简单来说,就是函数名相同,参数列表不同,即同名不同参,即可构成函数的重载。

《高质量C++/C编程指南》列出了重载的特性:
    ( 1)相同的范围(在同一个类中);
    (2)函数名字相同;
    (3)参数不同;
    (4)virtual关键字可有可无。
可以理解为重载的函数是两个不同的函数,在调用是,编译器会自动根据参数的情况调用其对应的函数
如:
#include<iostream>
using namespace std;

class C
{
public:
	void Cprint()
	{
		cout<<"This is print one"<<endl;
	}
	void Cprint(int a)
	{
		cout<<"This is print two"<<endl;
	}
	void Cprint(int a,int b)
	{
		cout<<"This is print three"<<endl;
	}
};

void main()
{
	C c;
	c.Cprint();
	c.Cprint(10);
	c.Cprint(10,20);
}

可以看到结果
根据传递的参数不同编译器所调用的函数也是不同的。


值得注意的是:函数重载时,返回值类型可以不同,但如果仅仅是返回值类型不同的话是无法构成重载的
class C
{
public:
	void Cprint()
	{
		cout<<"This is print one"<<endl;
	}
	int Cprint()
	{
		cout<<"This is print two"<<endl;
		return 0;
	}
};

此类情况无法构成重载,编译时就会出错。

二、覆盖和隐藏

覆盖和隐藏这两个概念很容易将人搞混,我们先从例子来看一下隐藏跟覆盖


class A
{
public:
	void show()
	{
		cout<<"This is A"<<endl;
	}
};

class B:public A
{
public:
	void show()
	{
		cout<<"This is B"<<endl;
	}
};

void main()
{
	B b;
	b.show();
}

这种称之为同名隐藏,切记,一定要同名同参,在子类继承基类时,子类中的成员函数会自动隐藏基类当中的同名同参函数。
隐藏后,通过子类构造的对象在调用该函数时,就不会调用基类中的函数,相当于基类中的函数还在,但是已经被子类所隐藏掉了。

其隐藏的特点是:

1.子类的函数与父类的名称相同,但是参数不同,父类函数被隐藏

2.子类函数与父类函数的名称相同,参数也相同,但是父类函数没有virtual,父类函数被隐藏


与之相似的是覆盖,覆盖是指子类覆盖父类函数,其特点:

1.分别位于子类和父类中

2.函数名字与参数都相同

3.父类的函数是虚函数(virtual)

即在父类的函数前面加virtual,如此便构成覆盖,这也是实现多态的基础之一。

人生是,美梦与热望
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值