C 多型性的總結

2022-08-04 07:36:12 字數 1729 閱讀 8370

1.什麼叫早繫結和晚繫結?
早繫結指在物件宣告的時候就和它的型別建立了關聯。

晚繫結是指**在執行時再檢查物件是否提供了我們所需要的方法和屬性。

靜態關聯(早繫結)和動態關聯(晚繫結)。

2.什麼叫多型性?

乙個介面,多種方法。

3.多型性和非多型性的區別?

多型與非多型的實質區別就是函式位址是早繫結還是晚繫結。如果函式的呼叫,在編譯器編譯期間就可以確定函式的呼叫位址,並產生**,是靜態的,就是說位址是早繫結的。而如果函式呼叫的位址需要在執行時才確定,這就屬於晚繫結。

4.乙個不帶虛函式的類(無成員變數)大小?

空類大小不為0,為1。

5.乙個帶虛函式的類(無成員變數)大小?

其物件會產生乙個虛函式表,,相當於多了乙個指標型的成員變數,在有成員變數時也同樣要考慮,比如含乙個char型成員變數,帶乙個或幾個(多少個也只有乙個虛表)虛成員函式,都相當於含乙個char, 乙個指標,sizeof()大小為8。

6.能不能在建構函式中呼叫虛函式?

在建構函式中呼叫虛函式時,採用早繫結,也就是虛函式機制在建構函式中不工作。

在c++建構函式中,虛函式呼叫會被編譯器自動轉為普通函式呼叫。

7.為什麼建構函式不能為虛函式?

1. 編譯器在構造物件時,必須知道確切的型別,才能正確的生成物件,因此不能採用晚繫結。

2. 由虛函式機制可以知道,在建構函式執行前,物件中的虛函式表指標並沒有正確的初始化,無法使用虛函式表來呼叫建構函式。

3. 在c++中,乙個類如果有多個建構函式,建構函式不能呼叫其他的建構函式。

8.純虛函式和虛函式區別?

純虛函式就是只宣告了有這種函式 但不會給出這個函式的內容 所以任何繼承了這個函式的子類的成員函式都必須定義這個函式的內容,如

果不定義,則子類也是抽象類,無法生成物件。

虛函式 宣告了有這種函式 而且給除了這個函式的內容 任何繼承了這個函式的子類成員函式 如果本身沒有定義這個函式的內容 就採用基類

的這個函式 如果子類重新定義了了這個函式 那麼通過基類的指標就能過根據物件來判斷選擇哪個函式 。

9.虛函式怎麼定義?

只需要在宣告前加virtual,不需要在定義時加,一旦基類的某個函式成為虛函式,子類對應的函式不需要加virtual,也會自動成為虛函式,

當然子類的子類對應的函式也會自動成為虛函式。

10.下面重點理解虛函式:

[cpp]view plain

copy

print

?class a  

;  void a::say();  

void b::say(void)  

1.虛函式的作用是晚繫結,如上例,a *p = new b ;p->say() ;如果say()是虛函式,則會在執行時動態選擇合適的物件say(),如果不是虛函式,則只會選擇a的say(),要明白一點,如果不是動態鏈結的,如b b;b.say();,這是靜態的,編譯器在編譯就知道應該呼叫b的say(),那麼是不是虛函式都無所謂的,

2.析構函式最好宣告為虛函式,這是針對new物件來說的,如上例,a *p = new b ,如果不用delete p;,那麼a和b的析構函式肯定都不會被呼叫,如果用了delete p,但析構函式不是虛函式,則只會呼叫a的析構函式,不會呼叫b的析構函式,這其實和2是同一道理,如果析構函式是虛函式,則呼叫b的析構函式再呼叫a的析構函式。

3.無論析構函式是不是虛函式,如果用b b這種靜態宣告,都會先呼叫b的析構函式再呼叫a的析構函式

C 多型性總結

多型性是c 語言最重要的基本特徵之一 正是因為多型性的靈活,才使之如此重要,也需要仔細思考才能很好把握 多型 polymorphism 動態繫結使編譯器能夠在執行時決定使用基類中定義的函式還是派生類中定義的函式 虛函式的前提是有基類及其派生類 在基類中要有虛函式的定義 成員函式的virtual宣告....

C 多型性總結

c 物件導向程式中存在三種多型 1 物件型別的多型。派生類的物件的型別既可以是派生類,也可以是基類,即乙個物件可以屬於多種型別。2 物件標識的多型。基類的指標或引用可以指向或引用基類物件,也可以指向或引用派生類物件,即乙個物件標識可以屬於多種型別,它可以標識多種物件。在物件識別符號定義時指定的型別稱...

C 多型性總結

多型是指同樣的訊息被不同型別的物件接受時導致不同的行為。所謂訊息是指對類的成員函式的呼叫,不同的行為是指不同的實現,也就呼叫不同的函式。換言之,多型指的就是用同樣的介面訪問功能不同的函式,從而實現 乙個介面,多種方法 物件導向的多型性可以分為4類 過載多型,強制多型,包含多型,引數多型。前面兩種統稱...