zoukankan      html  css  js  c++  java
  • 为什么父类指针可以指向子类反之则不行(内存长度不同)

    例如: 
    class a 
    {public: 
    int aa}; 


    class b:public a 
    {public: 
    int bb; 

    从内存的来看 
    如a 
    ---------| 
    |占一个int数据大小--| 
    |----(aa数据)------| 
    |--------- 
    而b则是 
    ---------|--------- 
    |占一个int数据大小--|占一个Int数据大小--| 
    |从a中继承而来------|---(bb数据----------| 
    |------------------ 
    当定义一个基类类型的指针时 
    a *p;这时,这个指针指向的是a类型的数据 
    当p指针指向派生类的时候,因为p是a类型的指针,所以*p只解释为a类型数据的长度,即
    ————————-|--------- 
    |占一个int数据大小--|占一个Int数据大小--| 
    |从a中继承而来------|-----(bb数据)-------| 
    |------------------ 
    |------------|------------| 
    |-p只指向这个区域_--| 

    因此,当基类的指针(P)指向派生类的时候,只能操作派生类中从基类中继承过来的数据。 
    指向派生类的指针,因为内存空间比基类长,会导致严重了后果,所以不允许派生类的指针指向基类。而基类的指针可以指向派生类。 

    C++的多态性能解决基类指针不能操作派生类的数据成员的问题。

    用C++比较好说明白:       
      1:指针的可访问性是由指针的定义决定的,比如说用BaseClass定义的指针,可访问的范围就是BaseClass的内存区域       
      2:允许用一个指向基类的指针指向派生类,由于被指向的对象的内存空间大于指针的可访问空间,所以这种向上映射是安全的       
      3:对象在调用虚函数的时候,是调用父类的函数还是调用派生类的函数,是和对象的类型有关的,比如说一个派生类B,其父类是A,则B的对象调用父类中被声明为VIRTUAL的函数时,被B   所OVERRIDE的函数调用的是B里的函数,而B没有OVERRIDE的函数调用的是基类里的函数  

    http://blog.csdn.net/yiruirui0507/article/details/6007767

  • 相关阅读:
    ZOJ 3332 Strange Country II
    ZOJ 3331 Process the Tasks(双塔DP)
    ZOJ 3326 An Awful Problem(模拟)
    HDU 1796 How many integers can you find(容斥原理)
    HDU 4059 The Boss on Mars(容斥原理)
    HDU 4135 Co-prime(容斥原理)
    HDU 5677 ztr loves substring(回文串加多重背包)
    CodeForces 668B Little Artem and Dance
    CodeForces 667A Pouring Rain
    Java实现 LeetCode 764 最大加号标志(暴力递推)
  • 原文地址:https://www.cnblogs.com/findumars/p/5811282.html
Copyright © 2011-2022 走看看