class
program
}class
aprivate
string _name;
}
class
program
}class
apublica(
string name)
private
string _name;
}
當不寫base時,派生類會找基類的無參建構函式,找不到會報錯
class
aprivate
string _name;
}classa1:
aprivate
int _score;
}
static
void
main
(string
args)
}class
apublic
void
afunc()
public
string _name;
}classa1:
apublic
void
a1func()
public
int _score;
}
a = a1
之後,a可以指向的資訊如下圖:
**執行結果如下:afunc沒寫內容所以內輸出,a._name
得到的(例項a1)
中的_name
值a1,如下圖:
(編譯期報錯)
(執行期報錯)
上面**中,原本指向(例項a1)
的a1引用
現在需要指向(例項a)
,但是a1引用
是a1派生型別
,它是需指向派生類的成員比如:_score
和a1func
,但是現在指向的(例項a)
中無法額外生成派生類的成員,所以轉型錯誤
示例**:
class
program
}class
apublic
int _a;
}classa1:
apublic
int _a1;
}classa2:
apublic
int _a2;
}}
執行結果如下 :
如上**基類引用可以指向其派生類的成員函式了,形成多型。
不知道c#的虛函式多型機制是如何實現的,c++是利用虛函式表,所以下面就以c++的虛函式表機制解釋下多型的形成
按照上文,我們知道基類的引用是無法找派生類的成員的,這裡之所以可以找到派生類成員,是因為虛函式表
的存在示例**如下:
class
program
}class
apublic
virtual
void
show()
public
int _a;
}classa1:
apublic
int _a1;
}classa2:
apublic
override
void
show()
public
int _a2;
}
執行結果如下:
當基類中存有虛函式時,在基類和派生類中對應例項記憶體中會多乙個隱藏資訊:虛函式表指標
,它指向虛函式表虛函式表其實就存放虛函式位址的陣列當呼叫虛函式時,首先去虛函式表位址裡找到對應的虛函式列表,在虛函式表裡再找到需要執行的虛函式
上述**對應的記憶體模型概覽如下:
;2,前往2096
處的表
3,獲悉表中第2個函式的位址6820
4,前往位址6820
,並執行這裡的函式(傳入this指標)
2,前往2096
處的表
3,獲悉表中第1個函式的位址4064
4,前往位址4064
,並執行這裡的函式(傳入this指標)
不過虛函式表示面對程式設計師的隱藏的,**書寫只需定義虛函式行為,編譯器去實現
物件導向的特徵 自動型別轉換 向上轉換型別
類polymorphism中的方法syame需要乙個student型別的引數,除了上述示例中的universitystu middlestu primarystu型別的物件外,也可以是其他student的子類的物件,甚至使用polymorphism編譯完成之後新編寫其他的student子類也不會有問...
C 向上型別轉換和向下型別轉換
有乙個毛病 遇到乙個問題,總想著以後在遇到再解決,導致乙個簡單的餓問題永遠在拖延,什麼也沒弄會。不知怎麼養成這個壞習慣,誓改之。一 向上型別轉換 所謂向上型別轉換,是指取乙個物件的位址,將其作為基類的位址處理,因為繼承樹是以基類為頂點的。此種轉換無需顯式型別轉換,正是利用這一性質從而實現了多型性。二...
c 中向上型別轉換和向下型別轉換
在c 的世界中有這樣兩個概念,向上型別轉換,向下型別轉換,分別描述的是子類向基類和基類向子類的強制型別轉換。在向上型別轉換的過程中 使用指標和引用不會造成切割,而使用直接賦值會造成切割。在向下型別轉換的過程中 使用dynamic cast進行向下強制型別轉換。使用此關鍵字有一下幾個條件 必須有虛函式...