继承对基类私有数据成员的访问(在派生类中继承基类成员函数)

Posted

技术标签:

【中文标题】继承对基类私有数据成员的访问(在派生类中继承基类成员函数)【英文标题】: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; 看看会发生什么。 【参考方案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

【讨论】:

以上是关于继承对基类私有数据成员的访问(在派生类中继承基类成员函数)的主要内容,如果未能解决你的问题,请参考以下文章

C#中继承类为啥可以通过属性访问基类的私有字段。

继承和派生

对基类成员数据的派生模板类访问

对基类成员数据的派生模板类访问

对基类成员数据的派生模板类访问

基类 派生类 类的继承与约束