c++类成员函数的重载,覆盖和隐藏有什么区别

如题所述

第1个回答  2020-06-08
1.成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual
关键字可有可无。
2.覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual
关键字。
3.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual
关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。
有关重载,应该是很好理解的(在同一个类中,函数名相同,函数的参数类型和个数不同),此处不予更多的说明,对于覆盖和隐藏(主要在基类和派生类中体现),借助下面这个例子来直观的说明:
#include<iostream>
using
namespace
std;
class
People
{
public:
//
隐藏:是指派生类的函数屏蔽基类函数
//
隐藏规则1:
//
1)
函数名相同
&&
参数不同
//
2)
virtual不影响
void
getId_different_params()
{cout
<<
"People::getId_different_params"
<<
endl;}
virtual
void
getName_different_params()
{cout
<<
"People::getName_different_params"
<<
endl;}
//
隐藏规则2:
//
1)
函数名相同
&&
参数相同
//
2)
无virtual
void
getPhone_same_params()
{cout
<<
"People::getPhone_same_params"
<<
endl;}
//
覆盖规则:
//
1)
函数名相同
&&
参数相同
//
2)
有virtual
virtual
void
getAddress_same_params()
{cout
<<
"People::getAddress_same_params"
<<
endl;}
};
class
Children
:
public
People
{
public:
//
隐藏:是指派生类的函数屏蔽基类函数
//
隐藏规则1:
//
1)
函数名相同
&&
参数不同
//
2)
virtual不影响
void
getId_different_params(int)
{cout
<<
"Children::getId_different_params(int)"
<<
endl;}
virtual
void
getName_different_params(int)
{cout
<<
"Children::getName_different_params(int)"
<<
endl;}
//
隐藏规则2:
//
1)
函数名相同
&&
参数相同
//
2)
无virtual
void
getPhone_same_params()
{cout
<<
"Children::getPhone_same_params"
<<
endl;}
//
覆盖规则:
//
1)
函数名相同
&&
参数相同
//
2)
有virtual
virtual
void
getAddress_same_params()
{cout
<<
"Children::getAddress_same_params"
<<
endl;}
};
void
main()
{
Children
*c
=
new
Children();
c->getId_different_params(1);
c->getName_different_params(1);
c->getPhone_same_params();
c->getAddress_same_params();
/*输出为:
Children::getId_different_params(int)
Children::getName_different_params(int)
Children::getPhone_same_params
Children::getAddress_same_params
*/
People
*p
=
new
Children();
p->getId_different_params();
p->getName_different_params();
p->getPhone_same_params();
p->getAddress_same_params();
/*输出为:
People::getId_different_params
//由于子类中的函数只是隐藏了基类中的函数而没有覆盖,因为指针为基类指针,故调用基类函数
People::getName_different_params
//由于子类中的函数只是隐藏了基类中的函数而没有覆盖,因为指针为基类指针,故调用基类函数
People::getPhone_same_params
//由于子类中的函数只是隐藏了基类中的函数而没有覆盖,因为指针为基类指针,故调用基类函数
Children::getAddress_same_params
//
由于子类中的函数覆盖了基类中的函数,虽然指针为基类指针,但是会调用子类函数
*/
}
相似回答