• C++学习16 继承时的名字遮蔽


    如果派生类中的成员变量和基类中的成员变量重名,那么就会遮蔽从基类继承过来的成员变量。所谓遮蔽,就是使用新增的成员变量,而不使用继承来的。

    成员函数也一样,如果函数名和参数签名都相同,就会造成遮蔽。如果仅仅是函数名相同,而参数签名不同,那么会构成重载。

    请看下面的例子:

    #include<iostream>
    using namespace std;
    class People{
    protected:
        char *name;
        int age;
    public:
        void display();
    };
    void People::display(){
        cout<<"嗨,大家好,我叫"<<name<<",今年"<<age<<"岁!"<<endl;
    }
    class Student: public People{
    private:
        float score;
    public:
        Student(char*, int, float);
        void display();  //遮蔽从基类继承的display()
    };
    Student::Student(char *name, int age, float score){
        this->name = name;
        this->age = age;
        this->score = score;
    }
    void Student::display(){
        cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
    }
    int main(){
        Student stu("小明", 16, 90.5);
        //使用的是派生类新增的函数,而不是从基类继承的
        stu.display();
        //使用的是从基类继承来的函数
        stu.People::display();
        return 0;
    }

    本例中,基类 People 和派生类 Student 都定义了 display() 函数,会造成遮蔽,stu 是 Student 类的对象,默认使用 Student 类的 display(),如第34行代码所示。

    但是,基类 People 中的 display() 函数仍然可以访问,不过要加上类名和域解析符,如第36行代码所示。

  • 相关阅读:
    c#异步执行方法
    sql 增加、修改、删除触发器小例子
    c#解决高并发加锁(Lock)
    sql中写事物和c#中执行事物
    socket 服务器浏览器与服务器客户端实例
    c# 写txt
    vs2003 序列化json
    一个完整的Windows 服务从创建到安装卸载
    js封装长度验证
    jquery 右下角弹出框
  • 原文地址:https://www.cnblogs.com/Caden-liu8888/p/5801805.html
Copyright © 2020-2023  润新知