当前位置:C++技术网 > 资讯 > C++继承:继承模型与内存模型的关系分析

C++继承:继承模型与内存模型的关系分析

更新时间:2015-06-23 23:44:06浏览次数:1+次

    对于这个话题,本人不是专家级别的,只是谈谈我个人的理解,如果有什么不准确的地方,请朋友们指出来。权当做是抛砖引玉罢了。
    继承,正如我们最开始学习的那样,大家都是知道怎么回事。然而在对象指针的转换时,总是不清楚如何转换是安全,如何是危险的。如果光靠记忆,我想永远都参不透。或许我们再深入探讨一下继承,或许可以参透,那么后面的理解就水到渠成。我并不会列举大量的代码去论证这个问题,如果你有兴趣,可以试试。我只是通过讲述一下模型,来阐明这个道理。好了,进入正题。
    撇开具体的继承的条条框框,也撇开抽象的对人类生活上的继承的定义,我们结合一下计算机内存模型来讲述这个问题。继承的概念,简单来说,就是积累的概念。我们不用从头去创造,只要继承,就可以省掉大量的工作。换个角度想,这就是前面的积累,给我们提供条件。这么说来,代码重用其实是继承最根本的表现。拥有代码重用,都可以叫做继承,只要我们不用重复创造就可以了。
    而放到计算机中,以内存模型来阐述。假如我们有两个对象,一个是基类对象,另一个是该基类对象继承而来。在内存中,所有的数据代码都是一段二进制数据。我们对这些概念的描述,其实是将它们抽象出来,便于理解,提高思想层次。但是,我们深入根本时,光理解这个抽象的概念,却使我们反其道而行,越整越模糊。所以,回归本源,我们看看计算机内存这些对象的样子,我们会有所顿悟。基类对象作为一个基础,在内存中是一段二进制数据,占一定的空间。而从这继承的对象,也就是说,基类这部分的东西,基本就直接复制一份过去了,不用重新构建,然后只要将自己的东西加入就实现了继承。
    所以说,继承模型简单来说,就是一个积累的模型。基类至少比子类一样大,如果子类加入了自己的东西,子类就比基类大,所有的内存空间就大了。那么在对象指针理解上,根据内存模型分析,基类指针就只能跨越基类对象所占的内存范围,而子类则在基类的基础上增加了一些东西,比如成员变量,成员函数。这些就将子类的空间增大了,那么子类对象的指针,自然所指的范围就更大些,如果让子类的指针去指基类,那么对于子类新添加的部分,基类是没有的,那么此时去通过子类指针去指基类对象,自然就会超越基类对象的边界,这样就出现内存访问越界,访问违规而错误。但是基类指针所指的范围始终都在子类的范围之内,因为子类将基类全部的东西都继承,因此无论基类指针如何指,都不会超越子类对象的内存空间范围,所以是安全的。至于指针类型转换,不用记忆,只需要根据这个理论,就很好理解和运用了。
    以上就是简单的分析,希望能够给一些朋友一些启发。如果有不准确的地方,请朋友们指出。权当做是抛砖引玉,期待更加精彩的文章出现。