在继承中访问私有成员

37

我有一个类A,它有一个声明为私有的字段val。 我想声明一个从A继承且可以访问val的类B。 在C++中有没有这样做的方法?

我的目的是需要重载A的一些函数,而不改变A的代码。

谢谢。


1
你无法访问另一个类的私有字段,无论它是否是祖先。如果你没有公共的getter/setter方法,那就没办法了。 - Viruzzo
1
如果您发布一个完整的、最小化的示例程序,我们可以编译和测试它,以更好地回答这个问题。 - John Dibling
1
你可以使用B中的数据“shadow” A中的数据/成员函数。它不会修改B中的数据。虽然它与重载不同,但在某些情况下可能会起到作用。 - Owl
6个回答

59

简短回答:你不需要这样做。这就是protected关键字的作用,如果你想授权子类访问但不允许任何其他人访问,则应使用该关键字。

private表示没有人可以访问这些变量,甚至包括子类。

如果你完全不能更改A中的代码,也许有一个public/protected访问方法可以访问该变量。否则,这些变量不应从子类中访问,只有黑客行为才能帮助你(我不鼓励这么做!)。


你认为父类中的私有纯虚方法怎么样?为什么编译器会显示错误以覆盖它?这意味着它们正在继承吗? - Asif Mushtaq
@UnKnown:是的,纯虚函数需要被重写才能使用基类。 - Constantinius
这是私有成员继承吗?因为在将纯虚拟方法声明为私有后,编译器会报错并要求我进行重写。 - Asif Mushtaq
拥有一个纯虚拟私有函数有点违背了它的目的:建立一个接口,继承类必须实现。 - Constantinius
@Constantinius 这不是真的;例如,可以看一下 https://isocpp.org/wiki/faq/strange-inheritance#private-virtuals - wonko realtime

27

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

class Base

  • public: 可以被任何人访问
  • private: 只能被基类成员函数(而不是派生类)访问
  • protected: 既可以被基类成员函数又可以被派生类访问

13

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


2
我其实很惊讶这个回答没有得到更高的评价,因为它做了两件事情:1)给出了正确的答案(大多数回答都说这是不可能的,可能是因为friend类并不是那么常用,所以他们不知道这个特性,或者因为他们来自一个没有这样东西的语言),2)提到了这不是一个好主意。当然,更好的回答应该是解释为什么这不是一个好主意。 :) - rbaleksandar

5

我已经知道 #define 技巧,但这个页面真是太棒了!谢谢! - Ch3shire
这是唯一能解决我的实际问题的答案 - 供应商的库有几个有缺陷的方法,我宁愿提供修复后的版本而不是复制和修改整个库。 - Throw Away Account

2
你需要将其定义为protected。受保护的成员被继承到子类,但无法从外部访问。

在继承受保护成员后,您可以提供公共访问。然后我们应该避免将个人数据保留在受保护的访问说明符中。 - Asif Mushtaq

0

你可以通过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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接