繼承與多型的使用 編譯錯誤和執行錯誤的分析

2021-09-29 01:56:03 字數 880 閱讀 7113

為了準備學校期中考試,特意複習了繼承與多型各種情況的分析:

在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,查了一下,原來是名空間在搗鬼。另外,名空間中的函式...