虛函式 虛基類 純虛函式 友元

2021-05-11 08:29:46 字數 801 閱讀 2052

虛基類

當在多條繼承路徑上有乙個公共的基類,在這些路徑中的某幾條匯合處,這個公共的基類就會產生多個例項(或多個副本),若只想儲存這個基類的乙個例項,可以將這個公共基類說明為虛基類.

classx1:virtual public x

classx2:virtual public x

虛函式實際上,優秀的程式設計師常常把基類的析構函式定義為虛函式。因為,將基類的析構函式定義為虛函式後,當利用delete刪除乙個指向派生類定義的物件指標時,系統會呼叫相應的類的析構函式。而不將析構函式定義為虛函式時,只呼叫基類的析構函式。

class a

~a()         // 非虛析構函式

private:

char * ptra_;

};class b: public a

~b()

private:

char * ptrb_;

};void foo()

在這個例子中,程式也許不會象你想象的那樣執行,在執行delete a的時候,實際上只有a::~a()被呼叫了,而b類的析構函式並沒有被呼叫!這是否有點兒可怕?

如果將上面a::~a()改為virtual,就可以保證b::~b()也在delete a的時候被呼叫了。因此基類的析構函式都必須是virtual的。

純虛的析構函式並沒有什麼作用,是虛的就夠了。通常只有在希望將乙個類變成抽象類(不能例項化的類),而這個類又沒有合適的函式可以被純虛化的時候,可以使用純虛的析構函式來達到目的

友員c++提供了一種特殊的資料訪問機制,  即給予某函式以訪問某個類私有成員的權利, 這個函式就稱為這個類的友員函式

虛基類 虛函式 純虛函式講解

虛基類 在說明其作用前先看一段 從 中可以看出類b c都繼承了類a的ivalue成員,因此類b c都有乙個成員變數ivalue 而類d又繼承了b c,這樣類d就有乙個重名的成員 ivalue 乙個是從類b中繼承過來的,乙個是從類c中繼承過來的 在主函式中呼叫d.ivalue 因為類d有乙個重名的成員...

虛基類 虛函式和純虛基類

首先看乙個例子 class base class child1 public base class child2 public base void main else p print 函式呼叫的時候,檢視虛表,根據p的位址首先從虛表裡面查詢要呼叫的函式 這裡呼叫child2的print 函式 ret...

C 虛基類 虛函式與純虛函式

虛基類 在說明其作用前先看一段 classa class b publica classc publica classd public b publicc void main 從 中可以看出類b c都繼承了類a的ivalue成員,因此類b c都有乙個成員變數ivalue 而類d又繼承了b c,這樣類...