「類名稱」+「::」呼叫方式
注:對靜態函式或靜態成員的呼叫方式不做分析;
以下提到的測試環境為vc6.0;
除錯程式時看到這樣的**:
1 pobj->classname::function();開始不理解為什麼要在「->」後加上類名「classname::」,一般使用中類名稱加「::」(classname::)是用來呼叫靜態函式或靜態成員的,帶著疑問做了下嘗試。
定義類a:
1呼叫方式:classa2
910 };
1 a* pa =null;測試能夠順利通過。但是除錯時進入a類的test()函式發現this指標為空:2 pa->a::test();
修改類a為:
1再次執行:classa2
5 ~a(){}67
void
test()814
15protected:16
int m_nval; //
增加成員變數
1718 };
1 a* pa =null;這次程式會崩潰,除錯發現是在使用成員變數時崩潰,如下圖:2 pa->a::test();
通過上面的測試初步得出結論,當採用pa->a::test()這種方式進行呼叫時,如果test()函式中沒有使用類的非靜態成員變數,呼叫的指標(具體的類物件指標this)是否為空可以不考慮,能夠順利通過,如果test()函式中使用了類的非靜態成員變數,則必須要求呼叫的指標不為null,也就是必須有已分配了記憶體空間的類物件,因為這些非靜態成員變數的空間是分配在類物件上的。對於類的靜態成員這裡就不在敘述(因為類的靜態成員屬於類本身,不屬於類物件)。
到這裡問題就來了,呼叫時直接寫成pa->test()不就可以了,幹嘛寫的這麼彆扭,給人感覺很深奧的樣子(事實是有點深奧),通過經驗猜測應該和繼承有關係,於是做了如下嘗試:
修改類a:
1增加類b繼承於類a:classa2
5 ~a(){} 67
virtual
void test() //
變為虛函式813
14protected:15
intm_nval;
16 };
1呼叫方式:classa2
5 ~a(){}67
virtual
void test() //
變為虛函式813
14protected:15
intm_nval;
16 };
a* pa = new b;
pa->test(); //第一步
pa->a::test(); //第二步
除錯時發現,當執行第一步時進入的是類b(子類)中定義的test()函式,執行第二步時進入的是類a(父類)中的test()函式,第一步呼叫是實現多型的一種方式很常見,而第二種呼叫方式是刻意破壞多型的結構,已達到指定的去執行父類的函式,我個人不贊成這種寫法,首先它打破了常規寫法,並且看起來不易理解,也不利於維護擴充套件,完全可以採取其他常見方式實現相應功能。
由於能力有限,如有錯誤和不當之處,敬請廣大讀者批評指正。
C 獲取呼叫DLL的類名稱
c 獲取呼叫dll的類名稱 下午 04 26 2011 2 14 想知道是哪個類呼叫了這個dll。在log裡需要記錄異常發生在哪個類裡,看了subtext是這樣寫的。methodimpl methodimploptions.noinlining private static type getcall...
呼叫介面實現類的方式
1.當要呼叫介面的實現類時,有2種方法 1 宣告介面,實現類例項化 2 通過配置檔案的方式,用和兩個標籤,決定使用介面的那個實現類 2.遇到的問題,別人寫好使,我寫不好使 1 使用ssh開發,宣告介面 peforumcommentservice 是介面 private peforumcomments...
Type類方式建立例項,呼叫類方法
由於需要做自定義控制項 使其通用化 為滿足對自定義類呼叫以及自動根據類名稱建立例項,所以想到以這種方式實現.建立type類 通過定義好的字串型的類名稱 類名稱最好具體到命名空間,方法參考 type類獲取型別方法 通過字串型的類名 使用methodinfo類 獲取類中定義的方法 例 methodinf...