问一下访问基类私有成员的问题

gzsdome 2009-01-17 10:23:47
假设A类的私有数据成员是int a,int b;
B类是A类的公有继承类,也就是说B类的私有成员中包括int a,int b;对吗?
如果对的话,书上说基类的私有成员只能通过其基类的公有成员函数访问(友元除外),
既然B类的私有成员包含了int a,int b,那麽我在B类中定义一个B类的公有成员函数,
通过这个公有成员函数而不通过基类的公有成员函数就可以访问int a,int b了(因为一个类的
公有成员函数可以访问自己的私有成员)我这理解有错吗?
...全文
528 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
ketet 2009-08-31
  • 打赏
  • 举报
回复
私有成员永远是不可访问的
yorkzjy 2009-08-31
  • 打赏
  • 举报
回复
对,没有错
wjcapple 2009-08-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiaoyisnail 的回复:]
假设A类的私有数据成员是int a,int b;
B类是A类的公有继承类,也就是说B类的私有成员中包括int a,int b;对吗?
不对,a,b是B类的基类子对象的私有成员

如果对的话,书上说基类的私有成员只能通过其基类的公有成员函数访问(友元除外),
既然B类的私有成员包含了int a,int b,那麽我在B类中定义一个B类的公有成员函数,
通过这个公有成员函数而不通过基类的公有成员函数就可以访问int a,int b了(因为一个类的
公有成员函数可以访问自己的私有成员)我这理解有错吗?
不对,B类只能直接访问基类A的protected或public成员,不能直接访问A的private成员


[/Quote]





如前所述,规则有他自己的适用范围,不要把类的定义和继承中的定义弄混淆了。类的某些定义在继承中不适用,他们有共同点,还有区别。我也迷茫了很久,重读了好几遍书,包括上机调试,终于把这些基本概念搞清楚了。这可能对你具体的编程的影响是潜在,不直接的,让你对自己学的东西有了深层次的把握。我也是比较喜欢钻钻这些概念的,理解了心情舒爽。
wjcapple 2009-08-31
  • 打赏
  • 举报
回复
B类的私有成员中包括int a,int b;对吗?
对的,B类继承了A类的所有成员,但是A类的私有成员对B类来说是,虽然是B类的成员,但对B类而言不可见。比如说一个朋友口袋里装了100块钱到你家,这100块钱在你家里面,但你并不能直接用,若想使用,需向你的朋友提出请求,你朋友自己拿出来,递给你,你不可以自己直接从朋友口袋里把钱掏出来。有些东西你只需理解,然后记忆,这些在一定范围内规定的一些规则,超出了范围,可能不适用了,或者范围外的规则,在这个地方也许不能适用,也有可能冲突,关键是要看其适用范围,不要想当然用规则。
liuwg9999 2009-08-13
  • 打赏
  • 举报
回复
jf
[Quote=引用 3 楼 xiaoyisnail 的回复:]
假设A类的私有数据成员是int a,int b;
B类是A类的公有继承类,也就是说B类的私有成员中包括int a,int b;对吗?
不对,a,b是B类的基类子对象的私有成员

如果对的话,书上说基类的私有成员只能通过其基类的公有成员函数访问(友元除外),
既然B类的私有成员包含了int a,int b,那麽我在B类中定义一个B类的公有成员函数,
通过这个公有成员函数而不通过基类的公有成员函数就可以访问int a,int b了(因为一个类的
公有成员函数可以访问自己的私有成员)我这理解有错吗?
不对,B类只能直接访问基类A的protected或public成员,不能直接访问A的private成员


[/Quote]
wjcapple 2009-08-13
  • 打赏
  • 举报
回复
你可以在B的成员函数调用A的成员函数
间接操作
可以吗?
maosher 2009-01-21
  • 打赏
  • 举报
回复
你可以在B的成员函数调用A的成员函数
间接操作
WillyWonka 2009-01-21
  • 打赏
  • 举报
回复
你可以考虑用一个基类对象指针想办法干掉这个私有变量,或者在基类中用一些临时的Get,Set的一些函数
lann64 2009-01-18
  • 打赏
  • 举报
回复
在B类对象的布局里的确存在它的基类私有成员,但从访问控制权上,它是B类对象不能访问的。
这跟类外不能直接访问类的私有成员是一个道理,尽管它存在,可还是不能直接访问。
梵净游云 2009-01-18
  • 打赏
  • 举报
回复
理解混淆,你把类A的私有成员和类B的私有成员混淆成一个了。它们是不同的,类A的私有成员是A::int a 和A::int b,类B的从类A中将这两个私有成员继承过来后就变成类B的私有成员了,它们应该是B::int a和B::int b,类B的公有成员函数只能访问B::int a和B::int b,不能访问A::int a 和A::int b
leez0301 2009-01-17
  • 打赏
  • 举报
回复
jiangtianyin 2009-01-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 brookmill 的回复:]
引用 6 楼 gzsdome 的回复:
那a,b继承后是B类的什么成员呢?

对B类自己来说,根本不知道有a和b,虽然它们确实存在
虽然通过调用基类的公有成员函数可以访问a和b,但是B本身完全不知道有这种访问
[/Quote]
这种说法比较正确
waizqfor 2009-01-17
  • 打赏
  • 举报
回复

假设A类的私有数据成员是int a,int b;
B类是A类的公有继承类,也就是说B类的私有成员中包括int a,int b;对吗?

不对 私有成员不能被继承的


如果对的话,书上说基类的私有成员只能通过其基类的公有成员函数访问(友元除外),
既然B类的私有成员包含了int a,int b,那麽我在B类中定义一个B类的公有成员函数,
通过这个公有成员函数而不通过基类的公有成员函数就可以访问int a,int b了(因为一个类的
公有成员函数可以访问自己的私有成员)我这理解有错吗?

第一个不对 第二个也不能对了 子类不能访问基类的私有成员 只能访问公有和受保护的
xiaoyisnail 2009-01-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gzsdome 的回复:]
引用 5 楼 brookmill 的回复:
private的a和b虽然包含在B类里的某个地方,但不是B类的私有成员,对B来说是不可见的


那a,b继承后是B类的什么成员呢?
[/Quote]

还是类B的基类A的成员,虽然有继承关系,但A和B是两个独立的作用域
brookmill 2009-01-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gzsdome 的回复:]
那a,b继承后是B类的什么成员呢?
[/Quote]
对B类自己来说,根本不知道有a和b,虽然它们确实存在
虽然通过调用基类的公有成员函数可以访问a和b,但是B本身完全不知道有这种访问
gzsdome 2009-01-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 brookmill 的回复:]
private的a和b虽然包含在B类里的某个地方,但不是B类的私有成员,对B来说是不可见的
[/Quote]

那a,b继承后是B类的什么成员呢?
brookmill 2009-01-17
  • 打赏
  • 举报
回复
private的a和b虽然包含在B类里的某个地方,但不是B类的私有成员,对B来说是不可见的
brookmill 2009-01-17
  • 打赏
  • 举报
回复
B类的私有成员中包括int a,int b;对吗?
不对

虽然B类里包含了a和b,但是不能直接访问,也不能通过B类的公有成员函数访问
要想访问,就把a和b定义成protected
xiaoyisnail 2009-01-17
  • 打赏
  • 举报
回复
假设A类的私有数据成员是int a,int b;
B类是A类的公有继承类,也就是说B类的私有成员中包括int a,int b;对吗?
不对,a,b是B类的基类子对象的私有成员

如果对的话,书上说基类的私有成员只能通过其基类的公有成员函数访问(友元除外),
既然B类的私有成员包含了int a,int b,那麽我在B类中定义一个B类的公有成员函数,
通过这个公有成员函数而不通过基类的公有成员函数就可以访问int a,int b了(因为一个类的
公有成员函数可以访问自己的私有成员)我这理解有错吗?
不对,B类只能直接访问基类A的protected或public成员,不能直接访问A的private成员

AlwaysSLH 2009-01-17
  • 打赏
  • 举报
回复
派生类成员函数无法直接访问积累私有成员
加载更多回复(1)

64,654

社区成员

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

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