问题
(多选)类成员函数的重载、覆盖和隐藏区别描述正确的有?
[ ] A. 覆盖是指在同一个类中名字相同,参数不同
[ ] B. 重载是指派生类函数覆盖基类函数,函数相同,参数相同,基类函数必须有virtual关键字
[ ] C. 派生类函数与基类函数相同,但是参数不同,会"隐藏"父类函数
[ ] D. 函数名字相同,参数相同,基类无virtual关键字的派生类的函数会"隐藏"父类函数
答案
C、D
解析
A选项:同一个类中,名字相同,参数不同,是重载不是覆盖。
B选项:描述的是覆盖,不是重载。
CD选项正确。注意:隐藏和覆盖都是针对基类和派生类成员函数之间的关系,而重载是同一个类中成员函数的关系。
重载、覆盖和隐藏
1.成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
2.覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
3.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
举例
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 test1()
{
/*
Children::getId_different_params(int)
Children::getName_different_params(int)
Children::getPhone_same_params
Children::getAddress_same_params
*/
Children *c = new Children();
c->getId_different_params(1);
c->getName_different_params(1);
c->getPhone_same_params();
c->getAddress_same_params();
/*
People::getId_different_params
People::getName_different_params
People::getPhone_same_params
Children::getAddress_same_params // not override
*/
People *p = new Children();
p->getId_different_params();
p->getName_different_params();
p->getPhone_same_params();
p->getAddress_same_params();
}
原文地址:https://www.cnblogs.com/xia-weiwen/p/8830876.html
时间: 2024-10-09 00:00:52