atl style 模板學習手記
atl的模板定義有些讓人看的眼花繚亂,如,
class cmywnd : public cwindowimpl ;
據說,這樣做是合法的,原因是c++的語法解釋過,即使cmywnd類只是被部分定義,類名cmywnd已經被列入遞迴繼承列表,是可以使用的。
將類名作為模板類的引數是因為atl為了在編譯期間的虛函式呼叫。而真正的虛函式,其多型性是在執行時刻決定的。
為此,做程式已觀之:
// atltemplate.cpp : 定義控制台應用程式的入口點。 //
#include "stdafx.h"
using std::cout;
using std::endl;
class base
protected:
void printclassname();
class d1 :public base ;
class d2:public base
;
template
class baset
protected:
void printclassname();
class td1 :public baset
;
class td2 : public baset
{};
class td3 : public baset
;
int _tmain(int argc, _tchar* argv)
最後的輸出結果:
my class name: base
my class name: base
my class name: td1
my class name: baset
my class name: td1
對於普通的類base來說,在基類base::sayhi()中呼叫printclassname()函式,只能呼叫自己看得到的函式: base::printclassname
所以d1雖然也定義了printclassname,但是沒有被呼叫。
如果將base中的printclassname前面加上virtual,則結果又不一樣了。結果d1呼叫的是自己類的函式d1::printclassname;
而後使用的模板,由於在基類中將this指標強制轉化成子類,導致可以檢視到子類的函式了。如果不用模板,如何能在基類中強制轉化成子類呢?真是高明。
Delphi學習手記
本人一直使用c buider,並開發了乙個 商關係管理 的三層應用系統.現公司要求使用delphi,沒辦法只有重新學習pascal語言.便記錄學習的過程,那就叫delphi學習手記吧.1 好象inherit form不行,如果想覆蓋上邊的方法,重寫事件或函式,竟然報錯,不懂先,是不是inherit不...
python學習手記
1.list由小到大排序用list.sort 由大到小排序用list.sort reverse true 2.list逆序用list.reverse 3.list 0 代表list中的第乙個元素,中括號一般用於表示元素位置,表示元素 4.dict中沒有排序的說法,keys用於表示位置,應用時用 6....
github學習手記
1.安裝配置 安裝 配置 git config global user.name your name git config global user.email email example.com ssh keygen t rsa c your email youremail.com 成功的話會在 下...