簡述多型的概念,子類和父類轉換是遵循的規則

2025-03-14 23:35:21 字數 3371 閱讀 4183

1樓:匿名使用者

/關於父類與子類的型別轉換:

procedure : tobject);

varlist1: tstrings;

list2: tstringlist;

beginlist1 :=;

list1 :=;

list2 :=;

tstrings 裡沒有排序方法 sort}/;

但可以把 list1 轉換一下}

tstringlist(list1).sort;

但如果把 list2 轉為 tstrings, 那 list2 也就丟失了 sort}

tstrings(list2).sort;;;

在j**a中,多型的概念,子類和父類之間轉換遵循的原則

2樓:匿名使用者

多型分為2種:

靜態多型:編譯時。方法的過載,根據不同的引數的傳遞,實現不同的功能。

動態多型:執行時。根據物件多型性,在繼承關係中,呼叫的方法不同。

向上轉型:a a = new b();

向下轉型:b b = b)a;

以上是 (a繼承b)

乙個引用能夠呼叫的方法,看等號左邊,是什麼型別的引用,具體呼叫的方法是哪個,看等號右邊,是什麼型別的物件。

多型存在的3個必要條件具體每個條件怎麼理解

3樓:可以叫我表哥

多型存在的3個必要條件:

1.要有繼承。

2.要有方法的重寫。

3.父類引用指向子類物件(對於父類中定義的方法,如果子類中重寫了該方法,那麼父類型別的引用將會呼叫子類中的這個方法,這就是動態連線)

對於多型,可以總結它為:

一、使用父類型別的引用指向子類的物件;

二、該引用只能呼叫父類中定義的方法和變數;

三、如果子類中重寫了父類中的乙個方法,那麼在呼叫這個方法的時候,將會呼叫子類中的這個方法;(動態連線、動態呼叫)

四、變數不能被重寫(覆蓋),」重寫「的概念只針對方法,如果在子類中」重寫「了父類中的變數,那麼在編譯時會報錯。

五、如果繼承的子類繼承父類的的乙個方法後加以過載,則該父類的引用不能使用過載之後的那個方法。

**示例:package ;

public class animal

class cat extends animal

class dog extends animal

public void lookdoor()

class tiger extends animal

package ;

public class test

public static void main(string args)}

4樓:

繼承,覆蓋,和父類引用。

比如有個shape的父類,shape有個方法叫draw()。circle和rectangle繼承了shape並實現了draw()方法。在很多場景中,我們不關心到底是什麼shape,只是想讓他顯示出來,void show(shape s) ,這樣就實現了乙個shape的不同行為。

多型理解,怎麼理解子類物件強制轉換父類物件?不是隻有子類可以賦值給父類引用嗎,那麼以下**如何理解

5樓:

讓父類(介面)引用指向子類物件(是自動型別轉換), 從而呼叫子類物件的方法,實現多型性。

而把父類物件要賦值給子類物件,需要進行強制型別轉換,跟多型性無關。

父類物件要賦值給子類物件,如果不進行強制型別轉換,編譯會報錯。

你寫出的**就是強制型別轉換,與多型性無關。

多型的意思是不是僅使用子類的特有方法,其他的屬性,方法都使用父類的,以達到統一?

6樓:網友

我們喝的酒有五糧液、茅臺酒、三花酒等這就是多型,那麼酒就是父類,這三種都是繼承了酒,所以是子類,我們定義乙個指向子類的父類引用型別,那麼就能夠引用父類的共性以及可以使用子類特有的特性,要理解好向上轉型。

j**a中父類和介面有什麼區別,多型的實現可以通過父類和介面嗎?

7樓:蕭雨之淚

介面就相當於是乙個規則,你要實現它就必須實現它定下的規則,父類繼承你可以直接使用它的方法,也可以自己去修改父類的方法,這叫做重寫,就是父類有乙個add(){的方法,你也可以寫乙個add(){這樣別人呼叫的就是你的add方法,你不寫就會呼叫父類的add方法了。

是不是乙個父類寫了乙個virtual 函式,如果子類覆蓋它的函式不加virtual ,也能實現多型?

8樓:水瓶仰望aa星空

只要基類在定義成員函式時已經宣告瞭virtue關鍵字,在派生類實現的時候覆蓋該函式時,virtue關鍵字可加可不加,不影響多型的實現。

容易與隱藏混淆:

隱藏是指派生類的函式遮蔽了與其同名的基類函式,規則如下:

1) 如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆)。

2) 如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)。

比如,在下面的程式中:

#include

class base

void g(float x)

void h(float x)

class derived : public base

void g(int x)

void h(float x)

通過分析可得:

1) 函式derived::f(float)覆蓋了base::f(float)。

2) 函式derived::g(int)隱藏了base::g(float),注意,不是過載。

3) 函式derived::h(float)隱藏了base::h(float),而不是覆蓋。

看完前面的示例,可能大家還沒明白隱藏與覆蓋到底有什麼區別,因為我們前面都是講的表面現象,怎樣的實現方式,屬於要分析覆蓋與隱藏在應用中到底有什麼不同之處。在下面的程式中bp和dp指向同一位址,按理說執行結果應該是相同的,可事實並非如此。

void main(void)

請大家注意,f()函式屬於覆蓋,而g()與h()屬於隱藏。從上面的執行結果,我們可以注意到在覆蓋中,用基類指標和派生類指標呼叫函式f()時,系統都是執行的派生類函式f(),而非基類的f(),這樣實際上就是完成的「介面」功能。而在隱藏方式中,用基類指標和派生類指標呼叫函式f()時,系統會進行區分,基類指標呼叫時,系統執行基類的f(),而派生類指標呼叫時,系統「隱藏」了基類的f(),執行派生類的f(),這也就是「隱藏」的由來。

C中父類的虛方法可不可以被子類的子類重寫

1 如果父類方法沒有加virtual關鍵字,即不是一個虛方法,則在子類中只能隱藏基類方法 new 而不能覆蓋 override 2 如果父類方法加了virtual關鍵字,即它是一個虛方法,在子類中一樣可以隱藏 new 3 如果子類實現了父類相同的方法 相同的方法名稱及簽名 而沒有new,在編譯時會報...

簡述中斷的概念和作用

中斷指當出現需要時,cpu暫時停止當前程式的執行轉而執行處理新情況的程式和執行過程 中斷是計算機中的一個十分重要的概念,在現代計算機中毫無例外地都要採用中斷技術。什麼是中斷呢?可以舉一個日常生活中的例子來說明,假如你正在給朋友寫信,鈴響了。這時,你放下手中的筆,去接 通話完畢,再繼續寫信。這個例子就...

簡述自我形象的概念和構成簡述形象設計的概念意義和基本原則

自我形象資源指的主要是容貌 魅力 風度 氣質 化妝 服飾等直觀的 包括天生的外表感覺的東西,這是一種值得開發 利用的資源。現代社會更是必不可少。自我形象資源的構成 形象的構成主要是由內涵和外延兩大要素構成的。內涵指的是一個人的道德品質和學識,道德品質是一個人內涵的基礎。古人云 欲修身必先利其德。在今...