C++向上轉型問題

在程序開發中,數據類型轉換是再正常不過的事情了,特別是C++這種強類型語言。例如我們常用的整型和浮點型數據的轉換;

float a = 1.23 ;

int b = a ;

cout<

輸出的將會是1,小數部分會被捨棄;

int a = 1;

float b = a ;

cout<

輸出結果將是1.000000,會自動加上小樹部分

類,其實也與int、float一樣是一種數據類型,那麼類也就自然存在類型轉換了,今天就來講一講C++的向上轉型:

所謂向上轉型就是將子類轉換為父類。請看下面代碼:

class Father

{

public:

Father();

~Father();

string firstName ;

void showName()

{

cout<firstName<<endl>

}

private:

};

class Child:public Father

{

public:

Child();

~Child();

string lastName ;

void showName()

{

cout<firstName<lastName<<endl>

}

private:

};

void main()

{

Father father ;

father.firstName = "mickal";

Child child ;

child.firstName = "nike";

child.lastName = "jordan" ;

father = child ;

father.showName();

system("pause");

}

最後打印出來的結果是:father's name: nike;

向上轉型有以下兩點要注意:

1、子類除繼承父類數據成員,並且還會有自己的數據成員,但是在向上轉型後子類的數據成員會被捨棄

2、賦值的本質是將現有的數據寫入已分配好的內存中,對象的內存只包含了成員變量,所以對象之間的賦值是成員變量的賦值,成員函數不存在賦值問題。這點從運行結果就能看出來,雖然有father = child賦值過程,但是father.showName()始終調用的都是 Father 類的 showName() 函數。換句話說,對象之間的賦值不會影響成員函數,也不會影響 this 指針。

圖示原理如下:

C++向上轉型問題

向上轉型原理示意圖

向上轉型非常安全,可以由編譯器自動完成,但是向下轉型非常危險,需要程序員自己處理,有可能會導致數據的丟失,原因是父類的指針或者引用的內存中可能不包含子類的成員的內存。

關於向下轉型的處理,後續我會從原理上詳細的分享出來。今天工作太忙了,就先分享這個最基礎的但是又十分重要的內容。

/<endl>

/<endl>


分享到:


相關文章: