我读过Scott Myers的书,他说继承会破坏封装性。当数据和内部方法是私有的(而不是受保护的)时,封装性是否还存在呢?
例如:
class Vehicle
{
int color;
public:
void set_color();
int get_color();
}
class Car: public Vehicle
{
public:
void change_tires();
}
我可以在不影响汽车的情况下更改车辆内部,对吗?
我读过Scott Myers的书,他说继承会破坏封装性。当数据和内部方法是私有的(而不是受保护的)时,封装性是否还存在呢?
例如:
class Vehicle
{
int color;
public:
void set_color();
int get_color();
}
class Car: public Vehicle
{
public:
void change_tires();
}
类似“继承破坏了封装性”这样的说法经常被断章取义。
这个说法指的是被继承的虚拟接口现在不再被封装。实际上,继承意味着某些原本隐藏的东西现在被暴露出来。像protected
成员和virtual
private
成员这样的东西都可以由派生类使用。
非virtual
private
成员仍然是隐藏的。
嗯,我不知道Scott Myers说了什么,但是无论如何,通过按照您指定的方式进行操作,汽车方法只能以与创建Vehicle对象时完全相同的方式访问Vehicle公共方法和属性(没有受保护的方法和属性),因此在这里没有破坏封装性,除非基类没有正确地封装。您只能使用set_color(...)方法更改Car的颜色,因为int color是私有的(如果未指定,则类属性和函数是私有的)。