2010-12-02 23:16:30
| 分類:
學習 | 標籤:
友元類的用法 |
字型大小大中小
訂閱 定義:
class b
friend class a;
};
將導致b無法被除a以外的其它任何class直接繼承以後例項化,也就是說,在上面這個定義的基礎上,如果你在定義:
class c:public b{};
將導致編譯能夠通過,但是無法例項化c(那當然也沒用了,所以間接實現了乙個無法繼承的類b),但是因為a是b的友元,所以能夠進入b的private區域,所以如果定義:
class a:public b{};
能夠例項化a.
但是這樣定義還有乙個漏洞,如果在a普通public繼承b的基礎上再定義:
class d:public a{};
你會發現d也是可以例項化的,那麼相當於間接public繼承了b。這顯然不是我們想要的,所以,正確的做法是(完整**):
class a;
class b
friend class a;
};
class a:virtual public b{}; //a is the one we're looking for
也就是說要做到三步:
1)將你b的相關建構函式放入private區域
2)宣告子類a為b的友元
3)定義a為virtual public繼承b
這樣建立的**的效果是:
b不能被繼承也不能被例項化
a可以被例項化,但是不能被繼承
所以,最後建立出來的a才是真正我們想要得到的物件
「a可以被例項化,但是不能被繼承」為什麼不能被繼承???
***********************************=
確切地說,a可以被繼承,但是繼承了a的類不能被例項化(那這個類也就沒用了)。假設有
class e:public a{};
則例項化e時:
e e;
系統將報告無法進入b的私有成員宣告而無法通過編譯。
這是因為 a是 virtual 繼承 b的,所以,e再繼承a的時候,需要由e去呼叫b的建構函式,但是e不是b的友元,所以無法編譯通過
但是如果a不是virtual繼承b的,那麼e再繼承a時,建構函式的呼叫情況是e呼叫父類a的建構函式,a再呼叫a的父類b的建構函式,而a是其父類b的友元,所以這一串呼叫能夠順利進行。
友元類 及用法
什麼是友元類 當乙個類b成為了另外乙個類a的 朋友 時,那麼類a的私有和保護的資料成員就可以被類b訪問。我們就把類b叫做類a的友元。友元類能做什麼 友元類可以通過自己的方法來訪問把它當做朋友的那個類的所有成員。但是我們應該注意的是,我們把類b設定成了類a的友元類,但是這並不會是類a成為類b的友元。說...
C 友元類的用法
今天 準備寫乙個 dx渲染類 用到了前面寫的 creadecive中的private變數 想了想就新增了乙個友元函式 這一天即可不要緊 錯誤接連不斷 最後終於調通了 其中在網上找的乙個例子幫了哦我不少大忙 如下 pragma once include time.h class date friend...
友元(友元函式 友元類 類成員函式的友元)
friend 友元機制 允許乙個類將對其非公有成員的訪問許可權授予指定的函式或者類。我們可以將友元大致分為3類 友元函式 是指某些雖然不是類的成員函式,但是能夠訪問這個類的所有成員的函式。比如我們下列的 include class test friend void show test rhs 宣告 ...