「類名稱」 「 」呼叫方式

2022-09-11 07:12:08 字數 1837 閱讀 1438

「類名稱」+「::」呼叫方式

注:對靜態函式或靜態成員的呼叫方式不做分析;

以下提到的測試環境為vc6.0;

除錯程式時看到這樣的**:

1 pobj->classname::function();
開始不理解為什麼要在「->」後加上類名「classname::」,一般使用中類名稱加「::」(classname::)是用來呼叫靜態函式或靜態成員的,帶著疑問做了下嘗試。

定義類a:

1

classa2

910 };

呼叫方式:

1 a* pa =null;

2 pa->a::test();

測試能夠順利通過。但是除錯時進入a類的test()函式發現this指標為空:

修改類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

classa2

5 ~a(){} 67

virtual

void test() //

變為虛函式813

14protected:15

intm_nval;

16 };

增加類b繼承於類a:

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...