名字遮蔽与类作用域

如果派生类中的成员(包括成员变量和成员函数)和基类中的成员重名,通过派生类对象或者在派生类的成员函数中使用该成员时,将使用派生类新增的成员,而不是基类的。

注意:基类的成员函数和派生类的成员函数不会构成重载,如果派生类有同名函数,那么就会遮蔽基类中的所有同名函数。

类是一种作用域,每个类都有它自己的作用域,在这个作用域之内定义成员。

在类的作用域之外,普通的成员只能通过对象(可以是对象本身,也可以是对象指针或对象引用)来访问,静态成员可以通过对象访问,也可以通过类访问。

在成员名前面加类名和域解析符可以访问对象的成员。

如果不存在继承关系,类名和域解析符可以省略不写。

当存在继承关系时,基类的作用域嵌套在派生类的作用域中。如果成员在派生类的作用域中已经找到,就不会在基类作用域中继续查找;如果没有找到,则继续在基类作用域中查找。

如果在成员的前面加上类名和域解析符,就可以直接使用该作用域的成员。

                 

#include <iostream>

class Base {
public:
    int value;
    void show() {
        std::cout << "Base::show() - value: " << value << std::endl;
    }
};

class Derived : public Base {
public:
    int value;  // 派生类成员变量,遮蔽基类成员变量
    void show() {
        std::cout << "Derived::show() - value: " << value << std::endl;
    }

    void display() {
        std::cout << "In Derived::display()" << std::endl;
        std::cout << "Derived class value: " << value << std::endl;
        std::cout << "Base class value: " << Base::value << std::endl;
        show();  // 调用Derived::show()
        Base::show();  // 调用Base::show()
    }
};

int main() {
    Derived obj;
    obj.value = 10;  // 设置Derived类的value
    obj.Base::value = 20;  // 设置Base类的value
    obj.display();

    return 0;
}

运行结果:

In Derived::display()
Derived class value: 10
Base class value: 20
Derived::show() - value: 10
Base::show() - value: 20

解释:

  1. Derived类中的value变量遮蔽了Base类中的value变量,因此在Derived类的作用域内默认使用的是Derived类的value变量。
  2. display函数中,通过Base::value可以访问基类的value变量,通过Base::show()可以调用基类的show函数。
  3. 默认情况下,调用的show函数是派生类中的show函数,因为它遮蔽了基类的同名函数。

通过这个例子,你可以看到在派生类中重名成员和基类成员之间的关系以及如何访问这些成员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值