现在的位置: 首页 > 综合 > 正文

c++面试收集

2018年01月17日 ⁄ 综合 ⁄ 共 861字 ⁄ 字号 评论关闭

1. "is-a"关系不能决定继承

  看过很多面向对象设计的书,一般都使用这种方法帮我们判断是选择继承还是选择组合:“is-a 关系选择继承,has-a关系选择组合”。

 

 

       但是这个只是初期的一般指导,我认为还有另一个因素:从到底是扩展父类接口还是压缩父类接口考虑。

 

 

       考虑下面这个经典设计问题:有矩形类和正方形类,他们之间是否该使用继承?

 

 

       正方形就是一个特殊的矩形,按照前面的方法,应该从矩形类继承没有问题。但是经典的设计解决方案没有这样做,而是把这两个类放在了同一个层次。(具体是哪本书忘了)

 

 

       分析原因:

正方形是一个矩形,没错。但是正方形不应该像矩形一样既有设置长的操作,也有设置宽的操作。所以正方形需要的接口其实小于矩形的接口,如果强制使其接口扩大,只会使人对正方形的概念模糊。

       其实,我们再来真正考虑一下到底继承做了些什么:增加属性、扩大接口。而这里正方形刚好两个都不需要。

同时,我们也可以看到使用继承关系时,这种一般和特殊的关系是通过增加属性和操作来做的。这种一般和特殊关系没有考虑到另一点:有时候特殊是对一般的某些一般性进行限制的。这里正方形就是对矩形本身的东西进行限制,限制其长宽相等。这不是通过增加某些东西来特殊话,而是改变原来的东西进行的特殊化。这种情况下,继承就是一个不好的解决方案。

by:kangtian0

附:

       其实单纯给类增加属性的时候,这时候还面临另一个选择方案:使用Decorator模式。这种情况下选择Decotator模式还是继承是竞争的,根据你的需要而定。

2.struct与C++的class的区别

C的struct与C++的class的区别:struct只是作为一种复杂数据类型定义,不能用于面向对象编程。
C++中的struct和class的区别:对于成员访问权限以及继承方式,class中默认的是private的,而struct中则是public的。class还可以用于表示模板类型,struct则不行。

抱歉!评论已关闭.