子类怎样访问父类的私有数据成员

改变自己23 2009-03-16 09:38:00
子类怎样访问父类的私有数据成员?
...全文
5482 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjb_yd 2010-10-29
  • 打赏
  • 举报
回复
其实办法是有的,你可以先求出父类私有成员在对象地址上的偏移,然后通过对象的地址加上偏移来访问父类私有成员。
不过这种代码是不可移植的,很可能换一个编译器就挂掉了。
gules 2010-10-29
  • 打赏
  • 举报
回复
用设计模式中的“模板方法”就可以达成,如下:

class Base {
public:
int get_data() const
{
return do_get_data();
}
virtual ~Base() {}
private:
virtual int do_get_data() const = 0;
};

class Derived : public Base {
public:
explicit Derived(int data) : data_(data) {}
……
private:
int do_get_data() const { return data_; }
private:
int data_;
};

// 使用:
int do_something(const Base& base)
{
return base.get_data();
}
WildWindWhy 2010-10-29
  • 打赏
  • 举报
回复
飘过,字数既然不够
xsfor 2009-11-16
  • 打赏
  • 举报
回复
子类指针强制转化为父类指针。根据父类的数据成员的位置,求得要访问的数据的地址,就能直接访问了。
wangyang327329 2009-11-14
  • 打赏
  • 举报
回复
1、通过父类的接口;
2、声明子类为父类的友元类;(最好不要这样)
yangyuebin 2009-11-14
  • 打赏
  • 举报
回复
如果讲究破坏性的话
哈哈,指针是万能的,直接用指针啦、不过,这个代码破坏得。。。。。
fanchangyong 2009-11-14
  • 打赏
  • 举报
回复
把父类中的成员改成protected,或者用一个public函数返回成员的值,或者用友元.
大海啊全是水 2009-11-14
  • 打赏
  • 举报
回复
作为父亲的也有自己的秘密嘛 儿子没事别去访问...用protected不错
starwalker 2009-11-14
  • 打赏
  • 举报
回复
提供接口,或改成protected
yyc23 2009-11-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 s79947171 的回复:]
C/C++ codeclass A
{public:int getData()const//写一个返回数据,并能保护数据的成员函数 {return num;
}private:int num;
};class B:public A
{
........
};int main()
{
B obj;
obj.getData();return0;
}
[/Quote]

这是得到基类私有数据成员的方法。如果想修改基类的私有数据成员,可以通过子类的构造函数调用基类的构造函数的方法来实现。当然这是在基类的构造函数已经对其私有数据成员初始化的基础上。
xiaoye 2009-11-12
  • 打赏
  • 举报
回复
若想其它类直接访问某个类的私有变量,只有把那个类设置成这个类的友元
woods2001 2009-11-12
  • 打赏
  • 举报
回复
只能通过父类中的共有成员才能访问
genlic 2009-11-12
  • 打赏
  • 举报
回复
父类public定义的成员函数直接返回需要访问的私有成员变量
改变私有成员变量值:通过成员函数传参数进去
Julykey 2009-11-12
  • 打赏
  • 举报
回复
通过接口
机智的呆呆 2009-11-12
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

class Base
{
private:
int i;
public:
void Print()
{
cout<<i<<endl;
}
};
class Drive:public Base
{
public:
void setBaseI(int i)
{
*(int*)(this)=i;
}
int getBaseI()
{
return *(int*)(this);
}

};
int main()
{
Drive d;
d.setBaseI(10);
d.Print();
cout<<d.getBaseI()<<endl;
system("pause");
}

有点走偏了~~~~
JackLam 2009-11-12
  • 打赏
  • 举报
回复
有的,可以利用地址访问
lovesi3344 2009-11-12
  • 打赏
  • 举报
回复
haiyouma?

[Quote=引用 9 楼 yuwei2589 的回复:]
1.通过基类的共有函数或者protect函数。(个人更倾向于protect函数)。
2.通过友元来访问。(方便,但是感觉这样设计有违把数据设计为“私有”成员的本意)。

只想到这么多了!
[/Quote]
topwong 2009-11-12
  • 打赏
  • 举报
回复
还有没有其它方法?
yuwei2589 2009-03-16
  • 打赏
  • 举报
回复

1.通过基类的共有函数或者protect函数。(个人更倾向于protect函数)。
2.通过友元来访问。(方便,但是感觉这样设计有违把数据设计为“私有”成员的本意)。

只想到这么多了!
加载更多回复(8)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧