1. 程式人生 > >為什麼父類指標可以指向子類,子類指標不能指向父類

為什麼父類指標可以指向子類,子類指標不能指向父類

class Base
{
public:
    int aa
};
class Child :public Base
{ 
public:
    int bb;
}

通過記憶體來檢視資料:

Base是:
---------|
|佔一個int資料大小--|
|----(aa 資料)----|
|---------
而Child則是:
---------|---------
|佔一個int資料大小--|佔一個Int資料大小--|
|從Base中繼承而來---|---(bb資料-------|
|------------------

定義一個基類指標指向派生類:

Base *p = new child();  

因為p是Base型別指標,所以*p只能解釋為Base型別的長度,如下

————————-|---------
|佔一個int資料大小--|佔一個Int資料大小--|
|從Base中繼承而來- -|-----(bb資料)----|
|------------------
|------------|------------|
|-p只指向這個區域_--|
 

 

總結:

因此,當基類指標指向派生類的時候,只能操作派生類從基類中繼承過來的資料。指向派生類的指標,因為記憶體空間比基類長,訪問的話會導致記憶體溢位,所以不允許派生類的指標指向基類。

理解:

通常來說,子類總是含有一些父類沒有的成員變數,或者方法函式。而子類肯定含有父類所有的成員變數和方法函式。所以用父類指標指向子類時,沒有問題,因為父類有的,子類都有,不會出現非法訪問問題。
但是如果用子類指標指向父類的話,一旦訪問子類特有的方法函式或者成員變數,就會出現非法,因為被子類指標指向的由父類建立的物件,根本沒有要訪問的那些內容,那些是子類特有的,只有用子類初始化物件時才會有。

參考連結:https://blog.csdn.net/zhouwei1221q/article/details/47953995