2011-05-17 143 views
4
class Base 
    { 
     //... 
     public int i = 5; 
    } 

class Drifted : Base 
{ 
    //... 
    public int b = 10; 
} 

Base ObjectOrReference = new Drifted(); 

所以Base ObjectOrReference;是引用基類型。 當我們寫Base ObjectOrReference = new Drifted();它成爲對象,因爲通過使用'新'我們爲它分配內存?或者它仍然參考,如果它是真的,它有什麼類型? 直接問題是:「是ObjectOrReference對象?」繼承基類參考C#

+0

你能否重新說明你的問題? – 2011-05-17 13:28:34

+0

基本上我被問到'ObjectOrReference'引用OR對象嗎?據我瞭解,它同時引用和受限制的「Drifted」類的對象,我的意思是它只能訪問'Base'中定義的成員。 – Nikita 2011-05-17 13:50:07

回答

12

它仍然是一個引用,指向堆上的對象的指針。它是類型。

即使你的參考是Base類型,底層對象是並在派生類任何重寫的成員將被用來代替那些Base,即使你試圖使用Base

在使用new語法的成員隱藏的情況下,如果您有對基本類型的引用,它將繞過隱藏成員的任何派生類。

可以通過谷歌搜索「C#參考類型」在線查找概述。我脫脂這一點,看起來像一個值得讀:

http://www.albahari.com/valuevsreftypes.aspx

+0

爲什麼我可以爲'ObjectOrReference.i'賦值如果'ObjectOrReferenc'不是對象,堆中的對象名稱是什麼。 – Nikita 2011-05-17 13:29:25

+0

@Nikita,因爲那是'Base'類型的成員。使用'ObjectOrReference'局部變量你看不到'Drifted.b',你需要轉換爲'Drifted'來看看。 – 2011-05-17 13:32:08

+1

@Nikita C#隱藏了它實際上指向堆上的內存位置的事實。 C#引用會自動解析爲對象,而在C++中則需要自己解析指針。 – 2011-05-17 13:34:12

7
Base ObjectOrReference = new Drifted(); 

用,你已經創建了一個實例,但由Base參考變量ObjectOrReference引用。目前它的功能僅限於Base中提供的功能。如果你想要訪問int b在,你必須將它投到

6

它是永遠是一個參考。將對象變量看作指針/引用。雖然實際的對象創建/分配發生在堆上,但引用是在本地堆棧空間上創建的。

7

是的,ObjectOrReference是一個對象和一個有效的對象。

這是類型的一個對象。這是一個面向對象編程的基本概念,基類的指針/引用(你的案例中的ObjectOrReference)可以持有/引用它的派生類的對象(在你的情況下爲),這就是爲什麼它不是一個錯誤和一個有效的對象類型

1

您已經實例化派生類的對象,但通過其基本類引用類型(ObjectOrReference)引用其內存位置。對象引用僅知道其類型的成員(即在其基類中),並完全不知道其派生類的成員。 所以你不能訪問派生類的成員,因爲我們在談論繼承問題,所以你不能在這裏輸入cast