其实这是一个贴的延伸:原帖:
最近看《深入浅出mfc》,其中说到类型识别技术,有个疑问:
是这样的,他为了登记类的信息,声明了一个结构CRuntimeClass,然后用宏把这个结构放到类里面去,但是既然这里面的类是继承关系的,为什么每一个子类还要再用这个宏声明一次呢?假如是可以继承的,那空间利用的就很糟糕了?子类拥有越来越多不必要的、父类对应的CRuntimeClass结构,这效率好像不高哦?后来这个帖子也有些朋友给了答复,不过都似懂非懂,于是自己也写了好几个小程序试了下,有几个发现,觉得还是挺有用的:1.子类还会有父类的CRuntimeClass结构,在书上的例子试出的结果是,好几次继承之后的子类CWinApp,除了自身的结构 ClassCWinApp外,还有父类的结构ClassCWinThread,再父类的结构ClassCCmdTarget,乃至根本类的结构 ClassCObject,也就是说,子类还是携带了父类的结构。2.有了第一个结论,我就想,那岂不有很多多余的空间浪费了??于是用sizeof()查看他们的大小,发现,宏所引入的这些结构,并没有让他们的大小发生任何变化,就是说,这些结构并没占空间,即使里面的数据很多。而假如我不用宏,这些结构会占有空间的。3.新的疑问:为什么宏有这样的效果,貌似这些结构对象真实存在,可以使用,为什么却偏偏不占空间?希望大家继续探讨一下4.更新的疑问:其实,为什么不可以在一开始,就把这个CRuntimeClass结构作为基类CObject的一个结构成员,统一叫 runTimeClass好了,然后一直继承下去,而且这个结构还是可以起到本来的作用,能构成型录网络,更重要的是,省空间,我觉得这样行得通,不知道大家觉得怎样?