觉得C++的继承访问控制方式不太合理,请大家赐教

nj_dobetter 2007-12-21 11:31:00
class Father{

};

class Son : public Father{

};

访问控制怎么由子类决定,子类想写public、protected、private都可以,这样的话那岂不是没有起到访问控制的目的。
觉得应该是父类自己保护自己,而不是由子类决定父类成员的可见性。

还有因为头文件是可见的,那么private成员实际上还是可见的,这个怎么解决,貌似C++自描述能力较差,毕竟是系统级编程语言。
...全文
223 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinosinux 2007-12-21
  • 打赏
  • 举报
回复
ding
wpalhm 2007-12-21
  • 打赏
  • 举报
回复
顶!
晨星 2007-12-21
  • 打赏
  • 举报
回复
来抢虫子的米。。。。

(1)父类的成员的访问权限父类自己当然可以控制,这就是成员的访问权限控制;
(2)子类虽然没有权利决定父类中哪些成员可被自己任意访问,但它有权利选择自己怎样继承,即选择“是否让外界知道自己从某类派生”这件事,这就是继承权限控制,它跟成员访问权限控制是无关的。我觉得这很合理,相反,如果死死地规定“只要A从B派生,那么外界就一定可以把A当成B类的一种”反而是非常不合理,毕竟具体的需求需要具体分析;
(3)C++的访问权限控制只控制可访问性,不控制可见性;其效果这在名字解析和重载解决中也可以看出来;
(4)C++的访问控制是用来辅助设计与开发,它从一开始就没有想被设计成用于防止黑客行为。
yuyunliuhen 2007-12-21
  • 打赏
  • 举报
回复
^_^
jixingzhong 2007-12-21
  • 打赏
  • 举报
回复
ckt1120
c.k.t -> BM@Orc
等 级:
发表于:2007-12-21 11:50:513楼 得分:0
“可见”并不是指看的见与否
而是指是否有权限去访问
====================================
这个楼主应该是明白的吧?

或者可以这么说:
1 父类的成员访问控制权限基本可以认为是可以由其自己控制的;
2 子类继承时候的 public、protected、private 控制的是子类从父类继承得到部分的访问控制权限,这个部分是子类自己的,不是父类的。
jixingzhong 2007-12-21
  • 打赏
  • 举报
回复
为了性能,为了兼容,为了 ...
C++ 做了很多妥协,有些问题是无法避免的,
所以,当你觉得某项特性不太合适的时候,
无需感到困惑,这很正常。


回到这个问题,
由父类确定访问控制权限,实现上是否存在点问题?
就目前来说,要进行访问限制,完全可以使用 private 进行保护。

所谓的 h 文件“可见”也不是特别大的问题,
因为正常情况下即使它们都是无法访问的。
当然,因为C/C++ 的指针,我们可以暴力操作,但是这个不做正常情况考虑。
ckt 2007-12-21
  • 打赏
  • 举报
回复
“可见”并不是指看的见与否
而是指是否有权限去访问
babyvox1999 2007-12-21
  • 打赏
  • 举报
回复
父类也保护了自己的私有成员的

还有因为头文件是可见的,那么private成员实际上还是可见的
可见有什么关系?
顶楼上的
ouyh12345 2007-12-21
  • 打赏
  • 举报
回复
觉得应该是父类自己保护自己,而不是由子类决定父类成员的可见性。
父类也保护了自己的私有成员的

还有因为头文件是可见的,那么private成员实际上还是可见的
可见有什么关系?
晨星 2007-12-21
  • 打赏
  • 举报
回复
楼上这句大实话啊。
nj_dobetter 2007-12-21
  • 打赏
  • 举报
回复
感叹……在靠近底层上建立舒适的编程平台不容易啊——一边是寄存器、二进制代码、硬件,一边是高层的软件架构(Frameworks)、组件。

再次谢谢各位高手!
nj_dobetter 2007-12-21
  • 打赏
  • 举报
回复
谢谢各位!

中午吃饭时,想起自己的疏忽,public、protected或private继承方式是对子类的子类做控制的。父类的成员控制方式已经确定。

大家讲的很清楚,我已明白。

jixingzhong、steedhorse讲的很清楚。
Jim_King_2000讲的桥接模式,很有用!
ph3571 2007-12-21
  • 打赏
  • 举报
回复
再顶,学习
babyofbaby 2007-12-21
  • 打赏
  • 举报
回复
楼主可以找一本最基本最简单的C++教材看看,先把一些最基本的概念性问题搞清楚。
Jim_King_2000 2007-12-21
  • 打赏
  • 举报
回复
在定义对象的时候,编译器必须知道对象的大小。因此尽管有些数据成员是private的,但是还是得出现在头文件中。使用Pimpl手法,可以减轻这种情况。

Pimpl手法如下:

// ToClient.h

class ToImp;

class ToClient
{
public:
void do_something(void);
...

private:
ToImp *imp_;
};


// ToClient.cpp

#include "ToClient.h"
#include "ToImp.h"

void ToClient::do_something(void)
{
imp_->do_something();
}


// ToImp.h

class ToImp
{
public:
void do_something(void);

private:
double ptStart_;
double ptEnd_;
};


// ToImp.cpp

void ToImp::do_something(void)
{
// do real things
...
}

用户只使用ToClient类,其它任何信息都被隐藏。这种手法在商用软件中很常见。
ryfdizuo 2007-12-21
  • 打赏
  • 举报
回复
支持jixingzhong,学习了
^_^

64,682

社区成员

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

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