在继承中访问私有成员
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
【讨论】:
【参考方案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;
【讨论】:
以上是关于在继承中访问私有成员的主要内容,如果未能解决你的问题,请参考以下文章