物件導向設計的重要目的之一就是**重用,而繼承和多型是物件導向的兩個最主要的特徵。本文將主要圍繞c++中的繼承展開討論,並以一些簡單的例子來說明。
一.首先觀察在繼承中,成員物件的初始化。
1.建立派生類物件時,程式首先建立基類物件,這意味著基類物件應當在程式進入派生類建構函式前被建立。
2.派生類建構函式應通過成員初始化列表將基類資訊傳遞給基類的建構函式。
3.派生類的建構函式總是呼叫乙個基類建構函式。
基類的標頭檔案base.h:
#ifndef base_h_
#define base_h_
class base
;#endif
base.cpp:
#include#includeusing namespace std;
base::base(int age)
;#endif
子類 son.cpp
#include#include#includeusing namespace std;
son::son(int age ) :base(22) //基類建構函式有輸入引數,子類應顯式的呼叫基類的建構函式
主函式:
#include#include#includeint main()
程式執行結果:
在這裡插一段,由於自己在學習python的時候發現類的繼承中,若要初始化父類的建構函式需利用super實現
"""python super example"""
class a:
def __init__(self,a):
print('這是a類的建構函式')
self.a=a
def add(self,a,b):
return a+b
class b(a):
def __init__(self):
#super(b, self).__init__(10)
print('這是b類的建構函式')
x=b()
print(x.add(2,3))
子類建構函式中沒有super程式輸出為:
加上super後:
可以看出加上super後可實現父類的初始化。
二、虛函式,多型性是物件導向程式設計的重要特徵,過載和虛函式是體現多型性的兩個重要手段。虛函式體現了多型的靈活性,進一步減少了冗餘的資訊。
說通俗一點就是:虛函式可以讓成員函式操作一般化,即用基類的指標指向不同的派生類物件時,基類指標呼叫其成員虛函式,會呼叫真正指向物件的成員函式,而不是基類定義的成員函式(派生類改寫了該成員函式),如沒有虛函式則不管基類指標指向哪個派生類物件,呼叫時都會呼叫基類定義的那個函式。
這裡一定要注意多型,多型的關鍵就是一切用基類的指標或引用來操作物件。
請看下面的例子:
為了方便看我把幾個子檔案放在了一起子類繼承父類,並且都有test方法,但是其實現的功能不一樣,父類test實現兩個數的相加,子類test實現兩個數相乘。
/*base.h 標頭檔案*/
#ifndef base_h_
#define base_h_
class base
;#endif
/*son.h 標頭檔案*/
#ifndef son_h_
#define son_h_
#includeclass son : public base
;#endif
/*base.cpp檔案*/
#include#includeint base::test(int a, int b)
/*son.cpp 檔案*/
#include#includeint son::test(int a, int b)
當我的main函式是這樣時請觀察輸出:
此時程式分別呼叫各自的test方法,基類輸出a+b;子類輸出a*b;但是並沒有做到真正的多型(多型的關鍵就是一切用基類的指標或引用來操作物件。)。
當main函式為如下程式時請觀察輸出:
#include#include#includeint main()
程式輸出:
可以看出此時程式的輸出並不是我們想要的那樣,而是都呼叫了基類的test函式。
這就需要引入虛函式了,此時僅需修改base.h檔案
在test前加上virtual關鍵字(注意建構函式不能是虛函式)
#ifndef base_h_
#define base_h_
class base
;#endif
程式的輸出:
可以看出加上虛函式後可實現基類指標呼叫真正指向物件的成員函式。以上為鄙人的一些愚見,特此總結,若有問題歡迎交流!好了,今天就總結到這溜了溜了!
遭遇select標籤一系列問題
1.設定選擇項,在ie6下要特別注意 下面的寫法ie6下有問題 j sy 0 selectedindex i 下面的寫法相容ie6,7,ff j sy 0 options i setattribute selected true 2.innerhtml,這個在ie下要特別注意。jquery的html...
mysql自動備份一系列問題
mysql自動備份一系列問題 測試環境終於搭建好了。伺服器選擇了mysql server 5.5.28,key驗證資訊也通過了,看來還是系統沒裝對。啟動資料庫 etc init.d mysql start 開始測試 首先連線mysql mysql u root p 初始密碼為空,直接回車。之後建立乙...
oracle 監聽相關的 一系列問題
自己裝了oracle 10.2.0後發現沒有listener.ora 便從網上找了個如下 generated by oracle configuration tools.listener description list description address protocol tcp host 1...