2013-05-31 39 views
-2

我有關於在基類和其子類之間進行投射的問題:在基類和子類之間進行投射

(1)爲什麼允許這樣做? (2)爲什麼不允許這樣做?爲什麼不允許這樣做?

ChildClassA c = (ChildClassA)new BaseClass(); 
BaseClass b = (BaseClass)c; 

(3)爲什麼允許這樣做?

BaseClass b = new BaseClass(); 
ChildClassA c = (ChildClassA)c; 

(4)爲什麼允許這樣做?

ChildClassA c = new ChildClassA(); 
BaseClass b = (BaseClass)c; 
+0

注意,(2)*是*編譯器允許 - 但你會在運行時得到一個'InvalidCastException' –

回答

4

投要麼允許或不允許的原因是背後傳承的基礎。

子類(或派生類)總是基類,但是相反是不正確的。

講解,讓我們用一些更真實的世界的名字爲你的例子類:

class Animal 
{ 
} 

class Dog : Animal 
{ 
} 

class Cat : Animal 
{ 
} 

因此,對於你的例子(1):

Animal b = new Dog(); 
Dog c = (Dog)b 

,因爲所有的狗都是動物這是真實的,你的動物b實際上是一隻狗,所以演員成功了。

對於示例(2):

Dog c = (Dog)new Animal(); 
Animal b = (Animal)c; 

這是不可能的,因爲你分配一個Animal對象的狗,但你知道,並不是所有的動物都是狗,一些動物是貓科動物。

而對於實施例(3)&(4):

Dog c = new Dog(); 
Animal b = (Animal)c; 

這是與上述相同的實施例1。所有的狗都是動物,所以任何狗可以被歸類爲動物和投(其實你不需要投,會有隱式轉換,你可以把它寫成Animal b = c;

+1

我不知道爲什麼我要編輯我的答案,我也想用狗的例子,我想在教學世界中動物留下來在編程中,因爲蜜蜂會留在性別上 –

0

嗯......

(2)是不允許的,因爲你不能施放BaseClassChildClassA - 的ChildClassA一個實例是通過繼承也是BaseClass而不是周圍的其他方式!

0
  1. 允許由於B是確實是一個ChildClassA
  2. 是不允許的,因爲你不能施放基類的childClass因爲基類不包含由childClass需要定義
  3. 被允許因爲工作ChildClass包含BaseClass的所有定義和一個ChildClass IS A BaseClass 4.same as 3?
1

(1)爲什麼允許這樣做? BaseClass b = new ChildClassA(); ChildClassA c =(ChildClassA)b

因爲ChildClassA是一個BaseClass。

(2)爲什麼不允許? ChildClassA c =(ChildClassA)new BaseClass(); BaseClass b =(BaseClass)c;

因爲BaseClass的是不是一個ChildClassA

(3)爲什麼這可以嗎? ChildClassA c = new ChildClassA(); BaseClass b =(BaseClass)c;

因爲ChildClassA是一個BaseClass。

(4)爲什麼允許這樣做? ChildClassA c = new ChildClassA(); BaseClass b =(BaseClass)c;

同問題3

當你創建一個繼承的類,這個類可以被澆鑄成基類的一個實例,因爲它是類的子類。但是,當您嘗試使用基類對象創建子類時,基類不具有子類的所有信息。

的孩子都知道其父是什麼,但家長不知道孩子有。

0

一般來說,這是因爲ChildClassA可能已經定義了BaseClass不知道的事情,而由於ChildClassA派生自BaseClass,所以它知道它的一切。

1

用「是」來思考。我們可以說ChildClassA的任何實例「是」BaseClass其中class ChildClassA : BaseClass。但反之亦然。我們不能說在這種情況下BaseClass「是」ChildClassA

現在嘗試閱讀您的代碼行如下。我相信這次會更有意義。

new ChildClassA()ChildClassA的實例,那麼它也是「是」BaseClass。因此,我們可以分配給new ChildClassA()其中bBaseClass

類型,我們可以施展bChildClassA,因爲它實際上(點)的ChildClassA一個實例。

我們不能投new BaseClass()ChildClassA因爲BaseClass實例「是不是」 ChildClassA