VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1563|回复: 10

由继承和派生想到......

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-6 16:50:01 | 显示全部楼层 |阅读模式
众所周知,在c++中,继承和派生是很重要的一个特性,
在我们大学课堂上,老师告诉我们如果派生类想要直接访问
基类的私有成员,那么可以用到protected,原因就不用说了


但是我想了想,觉得如果一个类就是为派生而设计的那么是不是
所有它的私有成员都设置成protected 就 呕咳了???

如果真是这样,那么我想MFC中是不会出现private 了

也许是我这个本科生太幼稚了,可是,既然protected既可以充当“私有”
和“公有”,那么何必在设置private 这个访问控制呢????


希望IT前辈--师兄师姐帮一下忙:)
回复

使用道具 举报

0

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-1-6 20:30:01 | 显示全部楼层
呵呵,private的私有特性保证了它只能由类自身和友元访问,就连其派生类也不行。如果用protected来代替,那么说明它还不是真正私有的,因为其派生类还可以访问它,封装其实是不完整的。
一个基类中确实有很多成员是不让派生类来访问的。所以必须有private。
回复

使用道具 举报

0

主题

8

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-1-6 20:36:01 | 显示全部楼层
如果用应用(就是写代码)的角度,我们不必追问为什么C++提供了这么多feature,我们只需要知道我们可以如何来使用这些feature。
从我的经验来说,对三种访问权限的使用可以这样:
1.无论这个类是否会被继承,使用"数据封装"的原则,所有的数据都设为private的。
2.如果想在继承类中使用这些数据,可以在基类中定义protected的成员函数用来访问或者修改私有数据成员,继承类中不直接访问这些数据成员,而是通过这些成员函数来访问。
3.最好不要定义接口(public成员函数)来直接访问数据成员,通过定义良好的接口来实现类和外界的通讯。
回复

使用道具 举报

0

主题

11

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-1-6 20:51:01 | 显示全部楼层
不是每个私有数据都合适提供给派生类直接操作——派生类未必是可靠的,如果任意直接修改数据成员,可能打破类的状态合法性。
回复

使用道具 举报

0

主题

12

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-1-7 09:48:01 | 显示全部楼层
private和protected之间的区别更多体现在类设计上,
private表现的是不公开,属于类本身的特性
而protected表现的是类将自身的某个特性授权给其它类可用

从实现的角度来讲,private更多的表现出实现继承,即:子类继承父类实现的功能而无法改变其功能
回复

使用道具 举报

0

主题

36

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-1-7 10:42:01 | 显示全部楼层
建议楼主去看看设计模式,针对于单体模式中,你用protected与用private的语义是不同的,
protected强调的是这个单体可以被用来继承为其它单体,而private的语义就是这个单体仅仅被用在了这个类的场合,它不能被继承为其它的类.
所以楼主还要多多学习呀,路慢慢其修远兮

回复

使用道具 举报

3

主题

10

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-1-7 22:18:01 | 显示全部楼层
楼主可以这么理解

私有的属性就是事物间本质的区别
而保护的就是事物内物品的特殊性
回复

使用道具 举报

0

主题

15

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-1-8 21:54:02 | 显示全部楼层
老套的话,存在即合理,当不合理时(到最后没有人用时)也就没有存在的意义了

楼上的都说了,这些性质都只是设计时的需要而已,没必要在这方面钻牛角尖

回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-9 14:00:02 | 显示全部楼层
private的变量和方法拿给写类的人用,protected拿给扩展这个类的人用,public拿给使用这个类的人用。protected破坏了封装性,组合和继承,优先考虑组合,
回复

使用道具 举报

0

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-1-15 20:18:01 | 显示全部楼层
这样设计肯定是有他的道理的:
protected成员:
     它所属的类,更重要的是,它所属类的任何派生类的成员函数,都可以访问它,如果你觉得将来可能会将某个类作为其他类的基类使用,那么任何派生类可能需要访问的数据成员就应该设置为 protected.而不是private,这就保证了这个类是"适合继承"的.

protected成员的危险之处:
     比方说,你编写了一个类库,打算将它分发为公共的,任何一个买了这个库的程序员能够简单地从它派生出其他的类来访问受保护的类的数据成员,这就使得保护成员的安全性远低于私有的,
为了防止数据遭到破坏,通常会强迫派生类只使用基类的公共函数来访问数据.

结论:
     使用protected指示符使程序设计变的简单,但是在真的使用的时候要衡权利弊!!

呵呵!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表