1樓:匿名使用者
記憶體分配肯定不一樣啦呀~~·
a an=new b();說明:在a堆裡面站了一個地址,然後在棧裡面存值~這個值是例項化new b()的值~
b b=new b();說明 在棧裡面直接開闢了一個b的空間!然後堆裡面有b的地址來指向直接開闢的空間!
2樓:江小右
記憶體,堆疊?c++的東西這是,有的時候從c#的角度來考慮,不要管c++的指標記憶體,因為c#不存在指標問題,處理c#對記憶體的考慮沒有c++那麼複雜,所以理解類不用考慮這些的。
效果不一樣,這裡倒和c++是相同的
3樓:
在這兩個類中不管是哪個類 每new 一次 就會在記憶體中新開闢一個空間 在堆裡面存這個物件 在棧區裡面就會有一個地址指向 該物件 所以每new 一次 你所的到的物件都是不同的 雖然 每個物件所執行的方法都一樣
至於 你所new的物件 有哪些方法 得看你具體實現了哪些介面的方法 以及繼承了哪些類...
我的回答就是這樣
4樓:來元彤
呵呵看看引用型別 和例項型別你就明白了
c#中如果存在方法過載,會根據其refrence type(引用型別)來呼叫物件的方法,而不是根據instance type(例項型別)來呼叫。
/*過載,覆蓋,隱藏之間的區別
* 過載(overload)用於同一類中的成員函式,其特徵為:
* 1)在同一類中
* 2)相同的函式名
* 3)引數不同(包括引數型別不同,或引數個數不同,或兩者都不同,注意:和返回值沒關係)
* 4)和是否虛擬函式無關
覆蓋(override)是指派生類函式覆蓋基類函式,其特徵為:
* 1)不同的範圍(分別位於派生類與基類)
* 2)相同的函式名稱
* 3)引數相同
* 4)基類函式必須是虛擬函式
隱藏(hide)是指派生類的函式遮蔽了與其同名的基類函式,其特徵為:
* 1)不同的範圍(分別位於派生類與基類)
* 2)相同的函式名
(3)若引數不同,基類函式無virtual關鍵字,基類函式將會被隱藏。(因為派生類和基類不在同一範圍,所以是隱藏而不是過載);
()若引數不同,基類函式有virtual關鍵字。基類函式將會被隱藏。(因為派生類和基類不在同一範圍,所以是隱藏而不是過載;因為引數不同,所以是隱藏而不是覆蓋);
()若引數相同,基類函式無virtual關鍵字。基類函式將會被隱藏。(因為基類函式不是虛擬函式,所以是隱藏而不是覆蓋)。
()若引數相同,基類函式有virtual關鍵字。如果基類函式有多個過載版本,且派生類並沒有重寫所有的同名虛擬函式,當在派生類中呼叫函式時,基類中未被重寫的虛擬函式將被隱藏。(當然,被重寫的函式就是覆蓋了)。
你看看這個
過載時,根據引數選擇呼叫的方法;
重寫時,訪問父類子類皆呼叫子類的重寫方法;
隱藏時,訪問父類則呼叫父類的方法,子類子類的方法。
c#中父類引用指向子類物件問題深究:
5樓:草薙在
哈哈,你想知道底層的東西麼?那我就告訴你,在底層中,一個變數是有型別的,而一個物件呢,也差不多算有型別的,在進行變數賦值的時候,clr會檢查是否可以允許賦值,如果是子類賦值給父類,或者子類給所實現介面類賦值的話,就可以。
當使用父類變數實際操作子類的時候,賦值欄位其實在底層上和直接操作子類變數沒區別,而呼叫方法則會使用callvirtual呼叫,這樣clr會根據實際情況呼叫父類或者子類方法(這情況講起來挺複雜的)
想徹底的瞭解這個東西,你需要學的還很多很多很多,我都是學了將近兩年才逐漸理解的,彆著急,慢慢來。
回答補充:
這就是說,其實物件在記憶體中是不會考慮什麼型別的,他有什麼欄位就是有什麼欄位,但是物件型別和變數型別是兩碼事,你不敢保證你的變數擁有什麼別的方法,比如汽車類,那麼轎車物件和卡車物件都可以賦給汽車的變數,但是你在寫**的時候敢保證他一定就是卡車,一定就有載貨這個方法麼?也許你敢保證,但是c#編譯器不敢,所以點不出來
我建議你學學反射,會讓你知道其實物件不管賦給什麼型別的變數,其實本身沒有變化,都是那個物件,只不過你看到的,你能用到的,所謂的廣義的介面,是不同的。
6樓:匿名使用者
其實父類引用指向子類的時候,只要稍作除錯就會知道是怎麼回事。
第一父類物件引用子類的時候父類物件只是一個說明,而真正例項化得則是子類物件,這就好比經紀人和歌手的關係,經紀人接到命令,真正幹活的是歌手一樣
7樓:匿名使用者
好抽象啊,大哥給個程式啊。
8樓:
【當用父類引用進行「.」操作的時候只能顯示出來父類的欄位值(也就是儲存在記憶體中子類物件的值),這樣理解對嗎?】
不對,父類引用子類的例項,其實這個物件屬於子類的型別,但編譯器會誤認為這個物件是父類的型別(因為編譯器只看它的申明型別),所以「.」操作仍然會呼叫父類的方法和屬性,這一過程在編譯時就已經完成了繫結,
但是如果這個方法是虛方法(用virtual修飾),情況就不一樣了,編譯的時候clr如果判斷該方法是虛方法,就會等到執行時才去晚繫結,所以在執行時這個型別該是什麼型別就會呼叫相應的方法,
9樓:匿名使用者
你的問題非常的好。
你加進集合中的的確是子類的例項,關鍵是你用什麼型別的引用指向這個子類的例項。關於你呼叫子類的屬性或者方法是要和它的引用型別吻合的,並不是子類例項的所有東西都一定能夠呼叫到。這個是物件導向的一個重要的特性。
舉個例子:
介面ia裡有方法: fa()
介面ib裡有方法: fb()
子類c實現(繼承)了介面ia,ib,並且子類自己定義了個方法fc(),則子類c就有:fa(),fb(),fc()三個方法
當子類c的例項objc被ia型別的引用指向的時候[ia objc = new c()或者(ia)objc],你可以呼叫到的是fa(),通俗的說objc這裡是ia型別的,而並不是c型別的,所以只能調ia的fa()
當子類c的例項objc被ib型別的引用指向的時候[ib objc = new c()或者(ib)objc],你可以呼叫到的是fb(),通俗的說objc這裡是ia型別的,而並不是c型別的,所以只能調ib的fb()
當子類c的例項objc被c型別的引用指向的時候[c objc = new c()或者(c)objc],你可以呼叫到的是fa(),fb(),fc()
這個其實就是面向介面或者說是物件導向程式設計的一個內容
c# 父類引用指向子類的例項為什麼需要強制型別轉換 子類裡面既然已經有父類的東西了 而且父類也只能
10樓:一年孤獨
「c# 父類引用指向子類的例項為什麼需要強制型別轉換?」
c# 父類引用指向子類的例項並不需要強制型別轉換。
當父類引用子類的例項後,如果需要使用子類特有的方法時才需要強制型別轉換。
舉例:namespace answer160429}//子類,繼承父類animal
class bird : animal
}class program}}
可以這麼理解以上**:
父類引用子類的例項》 鳥是動物嗎? 當然鳥是動物,所以無須型別轉換;
(現在程式將一隻鳥裝進了 放動物的黑箱子裡)現在有人問你這個黑箱子裡的東西會吃東西嗎?
這個黑箱子只能放動物,是動物就會吃東西,所以無須開啟黑箱子看裡面是什麼,就能回答說它會吃東西。
現在又有人問你這個黑箱子裡的動物能飛嗎?
那麼黑箱子的主人就不能直接回答問題了,因為箱子是黑的,上面只標識是動物,並不知道具體是什麼動物,主人必須開啟黑箱子看是不是鳥,如果是鳥才能回答說會飛。這就相當於強制轉換。
以上是個人理解。
11樓:成都肺癌腦轉移
a是父類 b是子類 a a= new b(); b b=(b)a;3955
j**a 子類的引用能指向父類的物件嗎
12樓:秋春春秋冬
1.從物件的記憶體角度來理解. 假設現在有一個父類father,它裡面的變數需要佔用1m記憶體.
有一個它的子類son,裡面的變數需要佔用0.5m記憶體. 現在通過**來看看記憶體的分配情況:
2.f = new father();//系統將分配1m記憶體.
13樓:素素姐愛上
當然可以。
class person
class student extends personmain function:
person p = new student();
j**a父類引用指向子類的物件是什麼意思?
c#中用父類引用去呼叫子類例項方法有哪些?
14樓:月影兒格格
子類使用override關鍵字重寫父類方法,則呼叫誰的方法由「執行時引用真實的物件決定」。
c#中子類重寫父類方法的幾種情況:
關鍵字:virtual、abstract、override、new。
1、virtual:
標識可能但不是必須被子類重寫的方法,
父類必須給出預設實現,子類可以重寫(使用override,new,或無特殊標識的普通方法),也可以不重寫該方法。
2、abstract:
標識必須被子類重寫的方法,父類不給出實現,子類必須用
3、override:
關鍵字重寫該方法。
標識重寫父類的方法,父類方法必須是用
abstract,virtual,override之一宣告,執行時將根據例項的型別而不是引用的型別呼叫物件的方法。
4、new:標識重寫父類的方法,父類方法可以用
virtual、override、new之一宣告,也可以是沒有特殊標識的普通方法,執行時會根據引用的型別選擇呼叫父類還是子類的方法,重寫父類方法時,使用new關鍵字與使用沒有特殊標識的普通方法是等效的,但是後者會給出一個編譯警告。
關於子類物件和父類物件的賦值求疑問。。c#中 父類物件和子類物件可以隨意互相賦值???
15樓:匿名使用者
樓主你好du~
父類和子類
zhi是不能隨意互相賦值的。
父類例項dao = 子類例項; // 可以編譯通過最簡單的用例專就是一個屬 object 可以被賦值儲存各種例項變數。
而子類例項 = 父類例項; // 編譯出錯正確的寫法是:
子類例項 = (子類型別)父類例項;
或者子類例項 = 父類例項 as 子類型別;
這種情況編譯通過,但是如果使用強制轉換以後出現了錯誤的賦值,那麼執行時報錯。
最常見的用例就是各種事件的第一個引數object sender,一般處理就是獲取觸發物件就是:
button bt = sender as button;
這就是提取了觸發這個事件的按鈕。
請追問~
c 類與物件,c 中類和物件的關係
include using namespace std class a public a a int jc int x int getx return n 此處不是成員函式,應刪掉。private int n static int count a a cin n count a a cout usi...
怎樣理解c 中的類和物件,c 中的類和類的物件是什麼意思
c 類的定義 類是定義同一類所有物件的變數和方法的藍圖或原型類也可以定義類變數和類方法。可以從類的例項中或者直接從類中訪問類變數和方法。類方法只能操作類變數,不必訪問例項變數或例項方法。系統在第一次在程式中遇到一個類時為這個類建立它的所有類變數的拷貝,這個類的所有例項共享它的類變數 c 物件的定義 ...
關於C 中類的問題,關於C 中類别範本的問題
include 標頭檔案以 h 結尾 using namespace std template class complex template void complex set t a,t b 類函式在函式體外定義要寫template 類名後要加,下面同此 template void complex ...