2301_79988067 2024-04-11 17:27 采纳率: 62.5%
浏览 27
已结题

关于c++基类私有成员不可访问的相关问题

大一新生,在学习继承的时候想问一下以下问题,
基类的私有成员在派生类中不可访问,那么基类的私有成员是否被继承?如果被继承,那设置为不可访问的意义或原因是什么?如果不被继承,那是如何通过成员函数间接访问的?
十分感谢

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-11 17:27
    关注

    引自免费微信小程序:皆我百晓生

    在C++中,基类的私有成员确实不会被派生类直接继承。这意味着派生类不能直接访问基类中的私有数据成员(变量)和成员函数(方法)。这是为了保护数据封装的原则,确保只有类内部的方法可以操作这些私有的细节。

    当基类的成员被声明为私有时,它的设计意图是限制对这些成员的访问,通常是为了防止不正确的修改或意外的数据泄露。在派生类中,虽然不能直接访问基类的私有成员,但可以通过基类提供的公共(public)或受保护(protected)成员函数来间接访问和操作这些私有成员。

    例如,基类可能提供一些公有接口(getter和setter方法),允许派生类安全地获取或更改这些私有数据。这样可以保持数据的安全性,同时允许必要的信息传递。

    下面是一个简单的例子,展示了如何通过公有成员函数来间接访问基类的私有成员:

    #include <iostream>
    
    // 基类
    class Base {
    private:
        int privateData; // 私有数据成员
    
    public:
        // 公共构造函数
        Base(int data) : privateData(data) {}
    
        // 获取私有数据的公有方法
        int getData() const { return privateData; }
    
        // 设置私有数据的公有方法
        void setData(int data) { privateData = data; }
    };
    
    // 派生类
    class Derived : public Base {
    public:
        Derived(int data) : Base(data) {} // 继承基类的构造函数
    
        // 使用基类提供的方法间接访问私有数据
        void printDerivedData() {
            std::cout << "Derived class data: " << getData() << std::endl;
        }
    
        // 可以重写基类的成员函数,比如这个setter
        void setData(int newData) override {
            if (newData > 0) {
                Base::setData(newData); // 调用基类的setData方法
            } else {
                std::cout << "Invalid data, not setting." << std::endl;
            }
        }
    };
    
    int main() {
        Derived derivedObject(10);
        derivedObject.printDerivedData(); // 输出:Derived class data: 10
        derivedObject.setData(-5); // 输出:Invalid data, not setting.
        derivedObject.setData(20);
        derivedObject.printDerivedData(); // 输出:Derived class data: 20
    
        return 0;
    }
    

    在这个例子中,Base类有一个私有成员privateData,并提供了公有方法getData()setData()来间接访问它。Derived类继承了Base类,并且可以调用这些方法来操作私有数据。尽管Derived类不能直接访问privateData,但它仍然可以利用基类提供的接口进行安全的操作。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 4月24日
  • 已采纳回答 4月16日
  • 创建了问题 4月11日