PB面向對象編程研究(二)

3. 繼承性

繼承性是面向對象編程的一個重要特性。它包括屬性的繼承和方法的繼承。在PB中,不支持多重繼承,即,一個類的父類只能有一個。

3.1. 類的繼承

點擊菜單“inherit…”可以打開繼承窗口。接着第二章中的範例內容,我們繼承創建一個類“uo_test_inherited”,如下圖。

 

點擊OK按鈕,保存對象爲“uo_test_inherited”。

3.1.1. 屬性的繼承

在“封裝性”一章的2.2.3節,已經看到了屬性的繼承。即,在uo_test的子類uo_test_inherited中可以訪問屬性ii_publicii_protected,但是不能訪問ii_private

3.1.2. 方法的繼承

創建一個uo_test_inherited對象,測試一下方法的繼承。由於我們在2.3.3節中已經創建了一個方法func,在uo_test_inherited對象中應該通過繼承已經擁有了這個函數。在窗口的Open事件中加入如下代碼,在close事件中加入destroy iu_test_inherited代碼。

 

運行程序,我們可以證實,在uo_test類中聲明的方法調用成功了,如下圖。

 

3.2. 構造順序

子類和父類都有構造器,那麼當子類在構造的時候,父類的構造器會被調用嗎?如果被調用是先調用子類的構造器還是先調用父類的構造器呢?爲了解答這個問題,我們分別在uo_testuo_test_inherited的構造器中加入代碼。分別如下圖:

 

 

在程序中創建一個uo_test_inherited對象實例後,我們運行程序,第一個出現的messagebox

 

點擊確定後,彈出來的是

 

繼承類消息對話框。

那麼,我們可以確定,在繼承後的類中,父類的構造函數首先被調用,然後是第一級子類,然後是第二級子類,依次類推。

3.3. 析構順序

對於析構器來說與構造器存在同樣一個問題,就是當繼承後,是子類的析構器首先被調用還是父類的析構器首先被調用呢?瞭解C++的人會馬上回答,是子類的析構函數首先被調用,但是不同的語言可能具有不同的特性,還是親手試驗一下再下結論吧。

同樣,我們在uo_testuo_test_inherited類中的析構器中加入如下的代碼:

 

 

運行程序,在依次完成uo_testuo_test_inherited的構造函數後,關閉程序,我們發現,首先析構的是uo_test

 

然後是uo_test_inherited

 

析構順序真的和C++不一樣,竟然是先析構父類再析構子類。

C++中,先析構子類再析構父類的原因是,父類是構成子類的基礎,如果基礎先不復存在了,那麼子類來說還有什麼意義呢?而在PB中先析構父類再析構子類又作何解釋呢?開句玩笑話,父親要比兒子先去世吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章