C 面試題總結

2021-08-02 12:48:54 字數 921 閱讀 5352

為什麼c++的member function template不能是虛的?

問題的意思是:為什麼在c++裡面,乙個類的成員函式不能既是template優勢virtual,比如,下面的**是不合法的:

class animal   

};

原因如下:

1. 從uuix/c開始,乙個c/c++程式就可以被分開編譯,然後用乙個linker鏈結起來。這種模型有有乙個問題,就是各個編譯單元可能對另乙個編譯單元一無所知。

2. 乙個function template最後到底會被例項化為多少個函式,要等到整個程式(所有的編譯單元)全部被編譯完成才知道。

3. 同時,虛函式的實現大多利用了乙個「虛函式表」的東西,這種實現中,乙個類的記憶體布局(或者說虛函式表的記憶體布局)需要在這個類編譯完成的時候就被完全確定。

所以,由以上的矛盾可知,c++的member function不能既是template又是virtual。

變數作為陣列長度

在棧上為什麼不能用變數做資料的長度,在堆上可以嗎?

—堆上可以,棧上不可以,棧上的位址空間只有在發生函式呼叫的時候才可以通過ebp指標來確定位址,堆上可以直接確定位址,可以直接定址。

c++:建構函式和析構函式能否為虛函式?

如果建構函式是虛函式,那麼就需要通過vtable來呼叫,但此時面對的是一塊raw memory,到**去找vtable呢?畢竟vtable是在建構函式中才初始化的,而不是在其之前,因此建構函式不能是虛函式;

析構函式可以是虛函式,且常常如此

因為此時vtable 已經初始化了,況且我們通常通過基類的指標來銷毀物件,如果析構函式不為虛的話,就不能正確的識別型別,就不能正確的銷毀物件;

c 面試題總結

using system class a public virtual void printfields class b a public override void printfields y x,y 當使用new b 建立b的例項時,產生什麼輸出?答 x 1,y 0 答案詳解 因為構造b之前,先...

C 面試題總結

1 程序與執行緒的區別?答案 2 程序間的通訊方式?答案 3 執行緒間的通訊方式?答案 4 棧和堆的區別?答案 5 c 和c的區別?答案 6 紅黑樹和b樹的區別?答案 7 產生死鎖的必要條件?已經如何預防死鎖?答案 8 tcp和udp的區別?答案 9 tcp狀態中 time wait 的作用?答案 ...

C 面試題總結

1 dynamic cast 與 static cast 區別 2 static,const,int int 初始化方式,初始化順序 3 虛函式呼叫原理,虛函式表多個物件共用乙個。4 非虛函式,如何呼叫的 5 拷貝建構函式與賦值建構函式的實現 6 純虛函式如何實現,抽象類能否被例項化,為什麼不能例項...