父類和子類之間的轉換問題
有兩個問題:(1)子類物件可以轉化為父類物件嗎?
(2)父類物件可以轉化為子類物件嗎?
------------------------------------------------------------------------------------------------------------------------------------
java:
第(1)個問題應該都不陌生,也沒什麼好探討的,肯定可以,因為在多型中經常用到。
如:class Father
{
};
calss Son extends publc Father
{
};
Father f = new Son(); //父類引用指向子類物件
其中,new Son()表示在在堆中分配了一段空間來存放類Son中的資料,
並返回一個Son的物件,並賦值給Father的引用f,即f指向子類的物件,
此時,子類的物件並沒有定義一個名字。
定價於:
Son s = new Son();
Father f = s;
---------------------------------------------------------------------------------
第(2)個問題:一般情況下,父類物件是不可以強制轉化為子類物件的,
如:
class Father
{
};
calss Son : publc Father
{
Son s = new Father(); //error
因為,子類除了從父類繼承一些東西外,它還增加了一些自己的東西,也就是說,
子類物件一般都比父類物件包含更多的東西。這樣的話,子類如果訪問子類新增的內容,
而這些內容父類並沒有,所以就會報錯。
但是,如果前提是:此父類物件已經指向了此子類物件,就可以轉換。
如:
Father f = new Son(); //父類引用指向子類物件
Son s2 = (Son)f; //可以
因為,子類強制轉換為父類物件時,並沒有實際丟失它原有記憶體空間(比父類多的那些部分)
只是暫時不可訪問,所以能再轉回來。
一般在前面加一條判斷語句 if(father instanceof Son);防止報ClassCastExcept異常。
如:
Father f = new Son(); //父類引用指向子類物件
if(father instanceof Son)
{
Son s2 = (Son)f;
}
結論:(1)子類物件可以轉化為父類物件
(2)一般不可以,但是如果此父類已經指向了此子類物件,可以
C++:
但在C++語言怎麼實現呢?一個指向子類的父類變數怎樣才能通過轉換賦值給一個子類物件變數?
可以用dynamic_cast 。
dynamic_cast的用法:
dynamic_cast < type-id > ( expression )
該運算子把expression轉換成type-id型別的物件。Type-id必須是類的指標、類的引用或者void*;
如果type-id是類指標型別,那麼expression也必須是一個指標,如果type-id是一個引用,
那麼expression也必須是一個引用。
dynamic_cast運算子可以在執行期決定真正的型別。如果downcast是安全的(也就說,如果基類指標
或者引 用確實指向一個派生類物件)這個運算子會傳回適當轉型過的指標。如果downcast不安全,
這個運算子會傳回空指標(也就是說,基類指標或者引用沒有指向一個派生類物件)。
dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。
在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;
在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class
B { public : int
m_iNum; virtual
void foo(); }; class
D: public
B { public : char
*m_szName[100]; }; void
func(B *pb) { D *pd1 =
static_cast <D *>(pb); D *pd2 =
dynamic_cast <D *>(pb); } |
相關文章
- 父類和子類的建構函式問題函式
- 子類繼承父類(父類和子類裡:塊、靜態塊、構造和方法覆寫)之間呼叫順序繼承
- 類的繼承_子類繼承父類繼承
- 如何理解Python3中的子類和父類?Python
- C# 繼承 子類(派生類) 父類(基類)C#繼承
- Java子類和父類的初始化執行順序Java
- hibernate subclass map 父類到子類時轉換出錯(大家幫下忙)(3)
- hibernate subclass map 父類到子類時轉換出錯(大家幫下忙)(2)
- 父類與子類之間靜態函式的呼叫以及函式引數的傳遞函式
- 關於CSS中的定位使用子絕父相(子類絕對位置和父類相對位置)CSS
- 鏈式-父類中返回子類物件物件
- 救命,關於類轉換問題
- 子父類中函式函式
- 子類擁有父類物件所有的屬性和方法,但無法訪問物件
- C#介面、抽象類、普通類和繼承(子類與父類)都有其特定的用途和場景C#抽象繼承
- java中父類宣告子類例項化Java
- 子類重寫父類的方法@Override的快捷鍵IDE
- Java--包裝類(基本型別和字串之間的轉換)、進位制轉換Java型別字串
- java中多型的理解——父類引用指向子類物件Java多型物件
- 子類繼承父類的建構函式(方法)嗎?繼承函式
- 子父類中成員變數變數
- Java 中建立子類物件會建立父類物件麼?Java物件
- Java 類載入之匿名類和主類相互依賴問題Java
- C++父類指標指向子類物件的實現原理C++指標物件
- java工具類之編碼轉換工具類Java
- c++中string類物件和字元陣列之間的相互轉換C++物件字元陣列
- 父類和子類物件的獲取值的方式驗證,透過父類屬性的方式獲取不到值,需要使用get方法物件
- day-25-類的繼承順序-父類對子類的約束-多型-佇列和棧繼承多型佇列
- 京東獲得jd商品分類API介面(父分類、根分類、子分類)API
- 一類子樹問題的總結
- [短文速度-4] new子類是否會例項化父類
- Json串與List、Bean之間的轉換,處理類中List屬性的序列化問題JSONBean
- JavaScript是如何工作的:深入類和繼承內部原理 + Babel和TypeScript 之間轉換JavaScript繼承BabelTypeScript
- 基類與派生類的轉換
- tcbs之集合類與子類的示例
- Java開發學習--Java 中基本型別和包裝類之間的轉換Java型別
- Java常用時間格式轉換工具類Java
- ML.NET 示例:多類分類之問題分類