【问题标题】:Inheriting access to private data members of Base class (with Base class member function inherited in Derived class)继承对基类私有数据成员的访问(在派生类中继承基类成员函数)
【发布时间】:2018-11-21 05:45:45
【问题描述】:

我读到“派生类不继承对私有数据成员的访问。但是,它确实继承了一个完整的父对象,其中包含该类声明的任何私有成员。”

但是,在下面的程序中,我可以访问私有数据成员。我做错了什么?

#include <iostream>
using namespace std;

class A
{
    private:
    int x;
    public:
    void printdata()
    {
       cout<<"x="<<x<<endl; 
    }
};

class B:public A
{
};

int main() 
{
    B obj;
    obj.B::printdata();

    return 0;
}

Link to Program

【问题讨论】:

  • 您没有访问A 的私​​有成员(即int x);您正在访问公共方法A::printdata()Printdata()class A的成员,所以可以查看私有成员。
  • 但我调用了 obj.B::printdata();
  • obj.B::printdata()public。试试cout &lt;&lt; obj.x; 看看会发生什么。

标签: c++ inheritance


【解决方案1】:

您正在使用public member functions 访问private 成员。

这就是你能够访问父类私有数据成员的原因。

x 是私有数据成员,它不适用于子类实例。查看下面的代码以获取更多详细信息

int main() 
{
    B obj;
    obj.x = 10; //Gives compilation error: 'int A::x' is private
    obj.B::printdata();

    return 0;
}

【讨论】:

  • @LelouchYagami 是的,你违反了安全性。
【解决方案2】:

你没有做错什么。

根据公共继承的定义,不能从派生类直接访问基类的私有成员,但可以通过调用基类的公共成员和受保护成员来访问。

参考C++继承:https://www.tutorialspoint.com/cplusplus/cpp_inheritance.htm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2014-11-27
    相关资源
    最近更新 更多