码迷,mamicode.com
首页 > 编程语言 > 详细

C++中类成员函数的重载、覆盖和隐藏(转自牛客网)

时间:2018-04-14 12:44:11      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:address   name   override   virt   pre   一个   new   over   c++   

问题

(多选)类成员函数的重载、覆盖和隐藏区别描述正确的有?
[ ] 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();
}

C++中类成员函数的重载、覆盖和隐藏(转自牛客网)

标签:address   name   override   virt   pre   一个   new   over   c++   

原文地址:https://www.cnblogs.com/xia-weiwen/p/8830876.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!