当前位置:首页 C++ > 正文

c++继承中的作用域(认识隐藏)

作者:野牛程序员:2024-01-03 13:41:07 C++阅读 2684

在C++中,继承引入了作用域的概念,其中子类(派生类)可以访问父类(基类)的成员。在继承中,可能会发生名称冲突,这时就涉及到作用域和隐藏的概念。

当子类定义了一个与父类相同名称的成员时,子类的成员会隐藏父类的成员。这种隐藏分为两种:

  1. 名称遮掩(Name Hiding):当子类拥有一个与父类成员相同名称的成员变量,子类的成员变量会隐藏父类的同名成员变量。这意味着在子类中访问该名称时,将引用子类的成员而不是父类的成员。

    class Base {
    public:
        int value;
    };
    
    class Derived : public Base {
    public:
        double value; // 子类中的value遮掩了父类中的value
    };

  2. 在这个例子中,Derived类中的value隐藏了Base类中的value

  3. 函数重载遮掩(Function Overriding Hiding):当子类拥有一个与父类成员相同名称的成员函数,子类的成员函数会隐藏父类的同名成员函数。这被称为函数重载遮掩。

    class Base {
    public:
        void display() {
            // 父类中的display函数
        }
    };
    
    class Derived : public Base {
    public:
        void display() {
            // 子类中的display函数,遮掩了父类中的display函数
        }
    };

  4. 在这个例子中,Derived类中的display函数遮掩了Base类中的display函数。

总的来说,继承中的作用域概念涉及到在子类中定义与父类相同名称的成员时的隐藏规则。这种隐藏有助于避免命名冲突,并允许子类拥有自己的成员,同时能够访问或重载父类的成员。


#include <iostream>

class Base {
public:
    int value;

    Base(int v) : value(v) {}

    void display() {
        std::cout << "Base class display: " << value << std::endl;
    }
};

class Derived : public Base {
public:
    double value;

    Derived(int baseValue, double derivedValue) : Base(baseValue), value(derivedValue) {}

    void display() {
        std::cout << "Derived class display: " << value << std::endl;
    }
};

int main() {
    // 创建基类对象
    Base baseObj(10);
    std::cout << "Base class value: " << baseObj.value << std::endl;
    baseObj.display();

    // 创建派生类对象
    Derived derivedObj(5, 15.5);
    std::cout << "Derived class value: " << derivedObj.value << std::endl;
    derivedObj.display();

    // 通过基类指针访问派生类对象
    Base* basePtr = &derivedObj;
    std::cout << "Accessing derived class through base class pointer:" << std::endl;
    std::cout << "Base class value: " << basePtr->value << std::endl;
    basePtr->display();  // 调用派生类的display函数

    return 0;
}

这个例子中,Base类有一个整数成员变量和一个成员函数displayDerived类从Base类继承,并且拥有一个双精度浮点数成员变量和一个重载了display函数的成员函数。在main函数中,展示了如何创建基类对象和派生类对象,以及通过基类指针访问派生类对象。注意到在派生类中,成员变量value遮掩了基类中的同名成员变量,而display函数也被重载遮掩了基类中的同名函数。

野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击