天天看點

基類指針指向派生類是安全的,而派生類指向基類則是不安全的

#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++的多态性能解決基類指針不能操作派生類的資料成員的問題

繼續閱讀