天天看点

基类指针指向派生类是安全的,而派生类指向基类则是不安全的

#include <iostream>

using namespace std;

class A  

{  

int x;  

public:  

A(int i){x=i;}  

virtual ~A(){};

virtual void dispa(){cout<<"x="<<x<<endl;}  

};  

class B:public A  

{  

int y;  

public:  

B(int i, int j):A(i){ y=j;}  

void dispb(){cout<<"y="<<y<<endl;} 

virtual void fun(){};

};  

int _tmain(int argc, _TCHAR* argv[])

{

A a(10), *p;  

B b(20, 30);  

p = &a;  

p->dispa();  

p = &b;  

p->dispa();

cout<<"sizeof(A)="<<sizeof(A)<<endl;

cout<<"sizeof(B)="<<sizeof(B)<<endl;

return 0;

}

基类指针指向派生类是安全的,而派生类指向基类则是不安全的

一个类或类对象只分配一个vptr的地址。

从内存上来看

如A

---------|

|占一个int数据大小--|

|----(x数据)------|

|---------

而B则是

---------|---------

|占一个int数据大小--|占一个Int数据大小--|

|从A中继承而来------|---(y数据----------|

|------------------

当定义一个基类类型的指针时

A *p;这时,这个指针指向的是A类型的数据

当p指针指向派生类的时候,因为p是A类型的指针,所以*p只解释为A类型数据的长度,即

————————-|---------

|占一个int数据大小--|占一个Int数据大小--|

|从A中继承而来------|-----(y数据)-------|

|------------------

|------------|------------| 

|-p只指向这个区域-|

因此,当基类的指针(P)指向派生类的时候,只能操作派生类中从基类中继承过来的数据和基类自身的数据。

而派生类指向基类的指针,因为内存空间比基类长,会导致严重的后果,所以不允许派生类的指针指向基类,虽然通过强制转换是可以编译通过的,但这是极不安全的做法。

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

继续阅读