c++的重载、覆盖和隐藏(遮蔽)

一直以来都没分清楚c++的重载、覆盖和隐藏(遮蔽),今天看书看到这里,还是很头大,于是写下来

 

1.重载

在同一个类中,或者在顶层函数(与main函数同层)中,如果

(1)函数名字相同

(2)但是函数签名不同

就是函数重载。所谓函数签名,就是函数的名字和参数列表(包括参数类型、个数、出现顺序)在编译期间生成的标识。注意,返回值不是函数签名的部分。

下面代码中,两个function函数就是重载函数

class ClassA
{
public:
	void function();
	void function(int);
};

再如,返回值不同,这样是编译不过去的。因为返回值不是函数签名的一部分,所以两个函数签名相同,自然也不是函数重载了

class ClassA
{
public:
	void function();
	int function();
};


2.覆盖

函数覆盖发生在继承层次之中。覆盖必须满足下面4个条件

(1)发生覆盖的函数必须分别在父类和子类中

(2)子类的成员函数的函数名与父类相同

(3)子类参数个数和类型与父类相同

(4)父类函数必须是虚函数

下面就是函数覆盖的一个例子,ClassA的指针指向ClassB类的对象,调用的是ClassB的函数

class ClassA
{
public:
	virtual void function();
};

class ClassB : public ClassA
{
public:
	void function();
};
int main()
{
	ClassA* pa = new ClassB;
	pa->function();
}

如果上面没有使用virtual关键字,那么调用的将是ClassA函数
可见,函数覆盖可以实现多态调用

3.隐藏(遮蔽):指子类中具有与父类同名的函数(不管参数列表是否相同),除了函数覆盖的情况

(1)子类的成员函数与父类的这个非虚成员函数有不同的函数签名

(2)子类的虚函数无法覆盖父类的虚函数

就是说,继承层次中,父类与子类的同名函数要么是覆盖要么是隐藏了

第一个例子:

上面的例子中少了virtual关键字的情况,这时候我们说ClassB::function遮蔽了继承而来的ClassA::function。

 

第二个例子:父类的function有一个int参数,而子类没有参数,是函数隐藏

class ClassA
{
public:
	void function(int);
};

class ClassB : public ClassA
{
public:
	void function();
};


第三个例子:父类是虚函数,但子类没有与其相同的函数签名

class ClassA
{
public:
	virtual void function(int);
};

class ClassB : public ClassA
{
public:
	void function();
};

 

总结:

(1)函数重载发生在同一个类或顶层函数中,同名的函数而具有不同的参数列表

(2)函数覆盖发生在继承层次中,该函数在父类中必须是virtual,而子类的该函数必须与父类有相同的参数列表

(3)函数隐藏(遮蔽)发生在继承层次中,父类和子类同名的函数中,不属于函数覆盖的都属于函数隐藏

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值