為了準備學校期中考試,特意複習了繼承與多型各種情況的分析:
在instantiate乙個物體(object)時,分別有兩種型別需要注意:
actual type (這個object的實際型別,也可以叫做static type),這個型別是在**編譯期間用到的
dynamic type (這個型別是**在run-time的時候用到的)
animal a =
newdog()
;
在這行簡單的**中,animal為actual type,dog是dynamic type。這就是在使用多型了(polymorphism)
那麼,我們使用多型的好處是什麼呢:
在程式compile期間,a的型別是animal,也就是說如果a呼叫了乙個方法,這個方法在animal class裡面存在,那麼就不會報錯,如果不存在,就會報錯。
在程式執行期間,a被當作dog type,所以被呼叫的方法也將是dog class裡面的
需要注意這麼幾點:
如果我們想用dog class裡面獨有的方法,也就是說這些方法不是從animal那邊繼承下來的,呼叫時需要先對a 進行 casting。如下:
(
(dog)a)
.bark()
;
downcasting 和 upcasting永遠不會在編譯期間報錯,然而sidecasting在編譯期間報錯。
但是,不在編譯期間儲存並不以意味著在執行階段不會報錯。
總結如下:
static type決定了乙個物體在編譯期間被當作的型別
dynamic type決定了乙個物體在執行階段被當作的型別
這是我在csdn第一篇原創文章,如有不對,請多多指教~!
java 型別轉換與編譯錯誤,執行時錯誤
在特定的情況下,我們可以把子類轉換成父類的 例項 這就是向上轉型 相反,我們也可以把父類轉換成子類的 例項 這就是向下轉型。向上轉型是安全的,向下轉型則不然。假設我們有三個類 bird,parrot,swallow,後兩個類繼承了bird類。向上轉型 class bird public void e...
C 的執行期多型和編譯期多型
今日的c 不再是個單純的 帶類的c 語言,它已經發展成為乙個多種次語言所組成的語言集合,其中泛型程式設計與基於它的stl是c 發展中最為出彩的那部分。在物件導向c 程式設計中,多型是oo三大特性之一,這種多型稱為執行期多型,也稱為動態多型 在泛型程式設計中,多型基於template 模板 的具現化與...
C 與namespace有關的兩個編譯錯誤的講解
某次,在大型的工程 中,我這樣呼叫 include using namespace std namespace a namespace b int main 編譯出錯 error fun was not declared in this scope,查了一下,原來是名空間在搗鬼。另外,名空間中的函式...