在程序開發中,數據類型轉換是再正常不過的事情了,特別是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 指針。
圖示原理如下:
向上轉型非常安全,可以由編譯器自動完成,但是向下轉型非常危險,需要程序員自己處理,有可能會導致數據的丟失,原因是父類的指針或者引用的內存中可能不包含子類的成員的內存。
關於向下轉型的處理,後續我會從原理上詳細的分享出來。今天工作太忙了,就先分享這個最基礎的但是又十分重要的內容。
/<endl>/<endl>閱讀更多 編程老大叔 的文章