为什么说如果我们用一个"基类的指针"指向一个"派生类的对象", 那么经由此指针, 我们就只能够调用基类(而不是派生类)所定义的函数.当我们声明一个对象指针的时候, 编译器实际上为我们做了什么, 或者说是如何初始化它的, 既然指针指向的是"派生类对象"的内存地址, 为什么无法调用派生类定义的函数. 此致感谢!

解决方案 »

  1.   

    这个问题,属于编译原理之类的。说来话长,建议看看侯Sir翻译的<<Efficient C++>>. 我给你简要说说。一个类的实例,在执行的(run time)时它的指针所指向的区域,仅仅包含,非静态数据成员和一个虚函数指针(如果这个对象的类或父类有虚函数的话。而静态数据成员在,类的各对象之间共享。就好像,多了一级公共变量(类级),好像全局变量(工程级)。对于第一个问题而言,类的成员函数都在编译时转化成普通的函数, 这个转化时用的是类名和函数名的组合,成新的全局函数.由于父类的对象不会自动转化为导出类的对象.编译通不过
      

  2.   

    第二个问题,申明指正,就是32的指针变量,任何指针的都是32位的.不过,在它的变量存的值,在new的时候取的类的对象的指针的.指针的类型,就是解释这个指针对象的
      

  3.   

    如果停留在表面看这个问题,可以简单的理解类的派生关系就像自下向上搭积木一样,每加一块,整体上表现为一个新的物体,但老的物体还存在,通过拿掉最上面的一块,仍然可以还原到原来的物体(包含有纯虚函数类的派生关系不符合该关系)。那么总共可以加多少块积木这一问题,就与你开始new的对象相关。至于底层的实现原理,我不赞同DivXExtend()推荐的<<Efficient C++>>,我认为《C++对象模型》(好像也是候sir翻的)是不错的选择。
      

  4.   

    stzhou(阿毛) :谢谢你的修正,对《C++对象模型>>更深入一些。