为什么父类指针可以指向子类反之则不行? 回答
例如:
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++的多态性能解决基类指针不能操作派生类的数据成员的问题。
举报
通常来说,子类总是含有一些父类没有的成员变量,或者方法函数。而子类肯定含有父类所有的成员变量和方法函数。所以用父类指针指向子类时,没有问题,因为父类有的,子类都有,不会出现非法访问问题。
例如:
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++的多态性能解决基类指针不能操作派生类的数据成员的问题。
举报
通常来说,子类总是含有一些父类没有的成员变量,或者方法函数。而子类肯定含有父类所有的成员变量和方法函数。所以用父类指针指向子类时,没有问题,因为父类有的,子类都有,不会出现非法访问问题。
但是如果用子类指针指向父类的话,一旦访问子类特有的方法函数或者成员变量,就会出现非法,因为被子类指针指向的由父类创建的对象,根本没有要访问的那些内容,那些是子类特有的,只有用子类初始化对象时才会有。
转自:http://blog.sina.com.cn/s/blog_523491650100i46c.html