基類與派生類的問題

2021-07-02 21:27:20 字數 2839 閱讀 7796

class base 

virtual~base() {}

void func1()

int getvalue()

protected:

virtual void func2()

protected:

int i;

};class child: public base

void func1()

protected:

void func2()

};int main()

輸出結果為 : 12

解析:base * pb = new child(1), 首先建立子類物件,初始化為1;

func1()不是虛函式,所以pb->func1()執行的是基類的func1函式,i= 10,然後呼叫func2()函式;

這裡的func2是虛函式,要往下派生類尋找,找到後執行派生類中的func2(),此時,i = 12;

最後執行pb->getvalue(),結果為12

基類與派生類的轉換

3種繼承方式(公用、保護、私有繼承)中,公用派生類才是基類真正的子型別,它完整地繼承了基類的功能。

不同型別資料之間在一定條件下可以進行型別的轉換。基類與派生類物件之間是否也有賦值相容的關係,可否進行型別間的轉換?回答是可以的。基類與派生類物件之間有賦值相容關係,由於派生類中包含從基類繼承的成員,因此可以將派生類的值賦給基類物件,在用到基類物件的時候可以用其子類物件代替

注意:有的資料型別是不可轉換的;有的轉換是不可逆的。

1、派生類物件可以向基類物件賦值。

可以用子類(即公用派生類)物件對其基類物件賦值。

如:

a al; 

//定義基類a物件al

b bl;

//定義類a的公用派生類b的物件bl

a1=b1;

//用派生類b物件bl對基類物件al賦值

實際上,所謂賦值只是對資料成員賦值,對成員函式不存在賦值問題。

注意:1、賦值後不能企圖通過物件a1去訪問派生類物件bl的成員,因為bl的成員與al的成員是不同的。假設ase是派生類b中增加的公用資料成員,分析下面的用法:

a1.age=23;//錯誤,al中不包含派生類中增加的成員

b1.age=21;//正確,b1中包含派生類中增加的成員

2、子型別關係是單向的、不可逆的。b是a的子型別,不能說a是b的子型別。只能用子類物件對其基類物件賦值,而不能用基類物件對其子類物件賦值,理由是顯然的,因為基類物件不包含派生類的成員,無法對派生類的成員賦值。同理,同一基類的不同派生類物件之間也不能賦值。

2、派生類物件可以替代基類物件向基類物件的引用進行賦值或初始化

如已定義了基類a物件a1,可以定義a1的引用:

a al; //定義基類a物件al

b bl; //定義公用派生類b物件bl

a&r=al;//定義基類a物件的引用變數r,並用a1對其初始化

引用r是al的別名,r和a1共享同一段儲存單元。可以用子類物件初始化引用r,將上面最後一行改為:

a&r=bl;//定義基類a物件的引用變數r,並用派生類b物件b1對其初始化或者保留上面第3行「a&r=al;」,而對r重新賦值:

r=bl;//用派生類b物件bl對a1的引用變數r賦值

注意

3、如果函式的引數是基類物件或基類物件的引用,相應的實參可以用子類物件。

如有一函式fun:

void fun(a&r)

//形參是類a的物件的引用

;student::student(int n,string nam,float s)//定義建構函式

void student::display()

//定義輸出函式

;

//工資

void graduate::display()

//定義輸山函式

程式的輸出結果:

num:1001

name:li

score:87.5

num:2001

nume:wang

score:98.5

為什麼沒有輸出pay的值?

通過本例可以看到:用 指向基類物件的指標變數指向子類物件是合法的、安全的,不會出現編譯上的錯誤。但在應用上卻不能完全滿足人們的希望,人們有時希望通過使用基類指標能夠調 用基類和子類物件的成員。如果能做到這點,程式人員會感到方便。在下一章就要解決這個問題。辦法是使用虛函式和多型性。

基類與派生類

初學c 的時候,很多人都很頭疼各種訪問標號下基類與派生類的關係,其實,死記硬背肯定不是乙個好的辦法,要知道它們之間的關係,先要分析一下訪問標號是如何產生的 在沒有繼承之前,類的只有兩類使用者 類本身和類的使用者。把類成員通過public和private劃分恰好體現了這一分割 類的使用者只能訪問類的p...

C 基類與派生類的問題

class mybasec i class myderivec mybasec i 問題1 程式編譯錯誤,問題是基類中不包含0引數的建構函式,為什麼不行。第乙個問題,子類例項化時一定會呼叫基類的建構函式,因為基類也一樣要被例項化,預設是呼叫無參的建構函式,而你這裡沒有,所有這裡會報錯。當然你也可以手...

基類與派生類的轉換

一 基類與派生類的轉換 3種繼承方式 公用 保護 私有繼承 中,公用派生類才是基類真正的子型別,它完整地繼承了基類的功能。不同型別資料之間在一定條件下可以進行型別的轉換。基類與派生類物件之間是否也有賦值相容的關係,可否進行型別間的轉換?回答是可以的。基類與派生類物件之間有賦值相容關係,由於派生類中包...