在继承中访问私有成员

Posted

技术标签:

【中文标题】在继承中访问私有成员【英文标题】:access private members in inheritance 【发布时间】:2012-01-04 16:51:04 【问题描述】:

我有一个 A 类,它有一个字段 val 声明为私有。 我想声明一个类 B,它继承自 A 并且可以访问 val。 有没有办法在 C++ 上做到这一点?

我想这样做是因为我需要重载A的一些函数,而根本不改变A代码。

谢谢。

【问题讨论】:

你不能访问别人的类私有字段,不管它是不是祖先。如果你没有公开的 getter/setter 方法,那你就倒霉了。 如果您发布一个完整的、最小的示例程序,我们可以编译和测试来说明您正在尝试做什么,这个问题会更好。 您可以将 A 中的数据/成员函数与 B 中的数据“隐藏”在一起。它根本不会修改 B 中的数据。它与重载不同,但在某些情况下它可能会完成这项工作。 【参考方案1】:

快速回答:你没有。这就是 protected 关键字的用途,如果您想授予对子类的访问权限但没有其他人,您可以使用它。

private 意味着没有人可以访问这些变量,甚至是子类。

如果您根本无法更改A 中的代码,则可能有一个public/protected 访问该变量的方法。否则,这些变量不应该从子类中访问,只有 hack 可以提供帮助(我不鼓励这样做!)。

【讨论】:

你如何看待父类中的私有纯虚方法?为什么编译器会显示错误来覆盖它?这意味着他们正在继承? @UnKnown:是的,纯虚函数需要被重写才能使用基类。 意思是私有成员继承?因为在将纯虚方法声明为私有编译器后,我错误地重写了。 拥有一个纯虚拟私有函数有点违背它的目的:建立一个接口,继承类必须实现。 @Constantinius 这不是真的; f.e.看看isocpp.org/wiki/faq/strange-inheritance#private-virtuals【参考方案2】:

您需要将其定义为protected。受保护的成员被继承到子类,但不能从外部世界访问。

【讨论】:

继承受保护成员后,可以提供公共访问。那么我们应该避免将个人数据保存在受保护的访问说明符中。【参考方案3】:

基类的私有成员只能由基成员函数(而不是派生类)访问。所以你没有权利甚至没有机会这样做:)

class Base

public:任何人都可以访问 private:只能由基成员函数访问(不能 派生类) protected:可以被基成员函数和派生函数访问 课程

【讨论】:

【参考方案4】:

好吧,如果您有权访问基类,则可以将 B 类声明为friend class。但正如其他人解释的那样:因为你可以,这并不意味着这是个好主意。如果您希望派生类能够访问它们,请使用受保护的成员。

【讨论】:

我真的很惊讶这没有被评为更高,因为它做了两件事:1)给出正确答案(这里的大多数答案基本上说这是不可能的,可能是因为friend类并没有被广泛使用,因此他们只是不了解此功能和/或因为它们来自没有类似功能的语言)和 2)提到这不是一个好主意。更好的答案是说为什么这当然不是一个好主意。 :)【参考方案5】:

这是可行的,如本周 Guru - GotW #76 - Uses and Abuses of Access Rights 中所述。但它应该被视为最后的手段。

【讨论】:

我已经知道#define 技巧了,但是这个页面太棒了!谢谢! 这是解决我实际问题的唯一答案 - 供应商的库有几个错误的方法,我宁愿提供它们的固定版本而不是复制和修改整个库。【参考方案6】:

您可以通过 A 的继承成员函数访问基类 A 的私有成员

#include<iostream>
using namespace std;

class A
    int a;
    
    public:
    A();
    A(int val)a=val;;
    
    int get_a()//To access a private variable it must be initialized here
        a=10;
        return a;
    
;

class B: public A
    int b;
    
    public:
    B();
    B(int val)b=val;;
    
    void get()
        cout<<get_a();
    
;

int main()
    A ob1(2);
    cout<<ob1.get_a()<<endl;
    
    B ob2(4);
    ob2.get();
    
    return 0;

【讨论】:

以上是关于在继承中访问私有成员的主要内容,如果未能解决你的问题,请参考以下文章

继承 Java 私有成员

使用受保护和继承时无法访问在类中声明的私有成员

回顾C++:访问权限控制之 公有保护私有继承用法详解与总结

为啥子类设法访问 c++ 私有继承成员? [复制]

5继承与派生2-访问控制

子类可以继承父类的一切方法,成员变量,甚至是私有的,但是却不能够访问这些私有的成员变量和方法