C 中如何定義派生類?舉例說明

2021-08-04 21:37:42 字數 5883 閱讀 1746

1樓:手機使用者

public公有繼承

protected保護繼承

private私有繼承

我們知道類的private和protected成員,在類外是不可以使用的.只有public成員可以在類外直接使用.

公有繼承時,基類的private成員派生類也不可用,基類的public和protected成員在派生類中可直接使用.繼承過來(變成派生類相應的public和protected成員)只有public成員在派生類外可以直接使用.

保護繼承時,基類的private成員仍為有私有.基類的public和protected成員變成派生類的protected成員,這時在派生類外也不能直接使用原基類的public成員

私有繼承時,基類的private成員仍為有私有.基類的public和protected成員將變成派生類的private成員.

舉個例子.

class a

;class b:public a

void setage(int nage)

void setmoney(int nmoney)

};b objb;//建立b類的物件objb

objb.m_ntelnum=123456;//可以

objb.m_nage=30;//錯誤.public繼承中基類的protected在派生類中是protected

objb.m_nmoney=100;//更錯誤,在派生類中都不可以直接使用.在類外就更不能了.

class c:protected a

void setage(int nage)

void setmoney(int nmoney)

};c objc;//建立c類的物件objc

objc.m_ntelnum=123456;//注意這裡和public的區別,這裡錯誤,m_ntelnum變成了c類的protected成員

objc.m_nage=30;//錯誤.protected繼承中基類的protected在派生類中是protected,這與public同相

objc.m_nmoney=100;//更錯誤,在派生類中都不可以直接使用.在類外就更不能了.

class d:private a

void setage(int nage)

void setmoney(int nmoney)

};d objd;//建立d類的物件objd

objd.m_ntelnum=123456;//錯誤,m_ntelnum變成了d類的private成員

objd.m_nage=30;//錯誤.private繼承中基類的protected在派生類中是private

objd.m_nmoney=100;//更錯誤,在派生類中都不可以直接使用.在類外就更不能了.

從例子來看,三種繼承從派生類內部引用來看好像沒有區別,只在類外引用時表現不同.現在還看不出public和protected繼承的區別

那再看一個例子.

class e:public b

void setage(int nage)

void setmoney(int nmoney)

};e obje;//

obje.m_ntelnum=123456;//可以

//其它的兩個就不能用了.

class f:public c

void setage(int nage)

void setmoney(int nmoney)

};f objf;

objf.m_ntel=123456;//錯誤,因為這是f的保護成員.注意與e類區別

class g:public d

void setage(int nage)

void setmoney(int nmoney)

};//那g在類外就沒有了可以引用的繼承過來成員了!

//這些繼承方式是很難理解的.最好的辦法就是多寫**去試.

2樓:

class printeddocument;

class book:public printeddocument //book是從printeddocument中派生的

;class *****backbook: public book   //*****backbook是從book中派生

;記住一點在你建立的類名後加冒號,再接訪問方式,再接父類,如上class book:public printeddocument

關於c++派生類中虛擬函式的問題

3樓:匿名使用者

如果是虛擬函式的話,在派生類中重新定義其函式體時,不會導致同名覆蓋.當用基類指標指向派生類物件並呼叫虛擬函式時,執行的是在派生類中重新定義的虛擬函式的函式體.

4樓:匿名使用者

虛擬函式必須要在基類用virtual修飾才能為虛擬函式,派生類若重定義該函專數,則無論是否有屬virtual關鍵字都是虛擬函式。你要判斷派生類中沒有用virtual定義的函式是否為虛擬函式,則可以:在該函式標誌特定的輸出,如cout<<"virtual function!

";然後定義一個基類的指標bp,指向新new的派生類物件,然後用bp呼叫所需判斷的函式,看是否有輸出特定的標誌virtual function!,如果正確輸出則說明是虛擬函式,其他情況則表明該函式不是虛擬函式。

5樓:匿名使用者

一旦一個函式被宣告為虛擬函式,那麼他從該點之後的繼承層次結構中都是虛擬函式,不管它在有

版沒有再次聲

權明是不是虛擬函式,有些程式設計師為了提高程式的清晰度,在繼承結構中喜歡再次明確的宣告這些虛擬函式.

至於「判定覆蓋的依據是兩者都是虛擬函式,發生在派生類與基類之間。」只是解釋了什麼是覆蓋,派生類將基類中的虛擬函式重寫即為覆蓋。

6樓:匿名使用者

想用虛擬函式是:基類、父類都要定義成virtual型別的

7樓:檀木妍

比如b是一個派生類,f是b裡面一個函式。

先去b的基類裡找,如果發現f原來在某個基類中有的專,看基類中f是不是虛函屬

數,如果是,那不管b中f有沒有virtual都是虛擬函式。

如果在基類中沒有發現f的原型,則就看b中f自己有沒有virtual了,有就是,沒有就不是。

8樓:匿名使用者

虛幻數必須要用上virtual!!你那本書喜歡玩文字遊戲!!是不是出自 天回 朝 的?!試試下面**,你就

答能領悟如何判斷是否用了虛幻數:

//虛擬函式的特性如下!!

#include "stdafx.h"

#include

using namespace std;

class a

};class b: public a};//由於此處引數定義的原因,show(b);效果與(*aa).a();一樣。

void show(a &a)

void main()

c++中派生類如何訪問基類成員變數?

9樓:匿名使用者

t=animal.a;

這句話不行。a是一個普通成員變數,只有對一個具體的物件,才會有.a這種用法。

10樓:匿名使用者

這裡a是public的可以直接訪問

void fw()

當然為了表明它屬於基類:

可以void fw()

如果是protected的也是這樣做。

如果你把它弄成private的了,可以在基類中定義public的一個相應的gette/setterr函式即可。

如果實在不想這麼做,又想訪問,可以用指標的方法無視許可權任意塗改,當然你要知道你的目的

別弄錯了,因為正常合法是不允許這麼做的,但練習無所謂。

11樓:匿名使用者

問題1:靜態變數可以通過繼承到子類裡,但是你不可能通過子類對x進行第二次初始化,絕對報錯

問題2:你可以在子類裡去修改這個靜態變數,但是在修改這個值之後,即使你去調基類的foo函式,x還是你在子類裡已經修改了的值,因為子類和基類的x其實是同一個,他們是同一塊記憶體。

問題3:在基類裡沒法訪問派生類的x。你可以通過多型的特性,在子類父類裡寫一個虛擬函式來設定x的值,然後通過使用a的指標去呼叫b類裡的方法。

但是對靜態變數而言沒有什麼意義,因為他們是同一個東西,在哪修改都一樣。

12樓:淺淺

c++中派生類對基類成員的訪問形式主要有以下兩種:

1、內部訪問:由派生類中新增成員對基類繼承來的成員的訪問。

2、物件訪問:在派生類外部,通過派生類的物件對從基類繼承來的成員的訪問。

三種繼承方式下,派生類對基類成員的訪問規則。

1、私有繼承的訪問規則

2、公有繼承的訪問規則

3、保護繼承的訪問規則

關於c++的:定義一個基類a,派生類b(class b:public class a )。類b中有

13樓:幻形術

class a

;private:

int a;

}class b:public a

private:

int b;}

14樓:類人界異

class b(b&b1):a(b1) 呼叫了父類的建構函式

15樓:愛問小聖

第一個呼叫a的預設拷貝函式,第二個是賦值,把b賦值給a,在此之前,a已經經歷了一次初始化了。所以這裡是賦值

16樓:籬笆三個

後者試圖把b類物件的引用給類a的建構函式

c++中如果派生類對基類繼承過來的函式功能不需要擴充可不可不定義而直接呼叫?

17樓:匿名使用者

如果基類的函式有定義,派生類可以不用定義直接呼叫,如果基類的函式沒有定義(純虛擬函式)則派生類在呼叫前必須定義該函式的函式體。

18樓:匿名使用者

關鍵看那個函式是不是 純虛擬函式(也就是 基礎類 只是宣告沒有定義)。如果不是,且功能已經足夠了你可以直接呼叫.

19樓:匿名使用者

基類的功能都有

bai,不需要定du義就可以呼叫用zhi基類的函式,如dao果重新定義了,則預設呼叫的是專新的函式

屬,但是你還可以用::符號指定呼叫基類的函式。當然要注意基類的是private 、protected、public ,稍微還有點區別。

20樓:巴扎嘿

c++中如果派生類對基類繼承過來的函式功能不需要擴充的話,可以直接使用基類中的函式。因版為派生類中繼權承了基類的屬性和方法。

如果基類中的實現和派生類中的方法實現不同的話,可以用虛擬函式。派生類繼承了基類虛擬函式的介面和預設實現,但是它可以對這個虛擬函式重新實現。

一般來說派生類的行為不可能和基類完全一樣,成員和函式都會有擴充。

c++中為什麼基類中只有帶引數的建構函式時,派生類中一定要顯示定義建構函式,並寫出基類的建構函式及引數

21樓:匿名使用者

因為建立派

抄生類物件時要呼叫基類的bai建構函式,當基類du沒有定義構函式時就調

zhi用預設dao無引數的建構函式。當只定義了有參的建構函式時就呼叫有參的建構函式,所以當派生類沒有給基類傳遞引數時就會出現錯誤。解決方法:

可以在基類中過載一個無參建構函式,或者給有參建構函式的引數設定預設值。

22樓:匿名使用者

當你定義一個派生類抄的物件時首

襲先呼叫的是基類的

建構函式,如基類的建構函式是帶參的 在派生類建構函式的後面會有基類的建構函式的傳參 否則就會報錯 指的是呼叫基類中你定義的這個建構函式而不是預設的無參建構函式

關於c派生類中虛擬函式的問題,C 已經在派生類中重定義了抽象類中的純虛擬函式,為什麼還不讓我用派生類定義物件!?

如果是虛擬函式的話,在派生類中重新定義其函式體時,不會導致同名覆蓋.當用基類指標指向派生類物件並呼叫虛擬函式時,執行的是在派生類中重新定義的虛擬函式的函式體.虛擬函式必須要在基類用virtual修飾才能為虛擬函式,派生類若重定義該函專數,則無論是否有屬virtual關鍵字都是虛擬函式。你要判斷派生類...

C 的基類如何訪問其派生類的成員變數

直接訪問靜態變數肯定不行,但可以變通一下,通過虛擬函式獲得這個內靜態變數 給你個容例子,這樣是不是滿足你的要求?但這樣的話,每個繼承類都要做2件事 1.定義靜態變數 2.重寫虛擬函式,返回自己的靜態變數 這2件事可以通過巨集來做。mfc好象就是這麼幹的 include class a class b...

c中請說明類的三大特性,並舉例說明類的繼承和多型

以控制元件來說 封裝來 你用那些控制元件自,只需要 呼叫bai具體的屬性和方法du,對怎麼呈現的根本zhi不需要了dao解,這就是封裝 繼承 有個control基類,封裝了常用的方法和屬性,所有控制元件都是繼承自它,而且都會有這些屬性和方法,這就是繼承 多型 control類是繼承自object,o...