創建一個Win32應用程序的步驟:
1.編寫WinMain函數,可以在MSDN上查找並複製;
int WINAPI WinMain(...);
2.設計窗口類;WNDCLASS
WNDCLASS wndcls;
3.註冊窗口類;
RegisterClass(&wndcls);
4.創建窗口;
CreateWindow(...);
5.顯示並更新窗口;
ShowWindow(...):
UpdateWindow(...);
6.編寫消息循環;
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
7.編寫窗口過程函數。可以通過MSDN查看WNDCLASS的lpfnWndProc成員變量。
LRESULT CALLBACK WinSunProc(...);
如果一個類中沒有定義任何構造函數,那麼編譯器只有在以下三種情況,纔會提供默認構造函數:
1.如果類有虛擬成員函數或者虛擬繼承父類(即虛擬基類)時;
2.如果類的基類有構造函數(可以使用戶定義的構造函數,或編譯器提供的默認構造函數);
3.在類中的所有非靜態的對象數據成員,它們所屬的類中有構造函數(可以是用戶定義的構造函數,或編譯器提供的默認構造函數);
純虛函數:
純虛函數是指被標明爲不具體實現的虛成員函數(注意:純虛函數也可以有函數體,但這種提供函數體的用法不多見)。凡是含有純虛函數的類叫做抽象類,這種類不能聲明對象,只是作爲基類爲派生類服務。在派生類中必須完全實現基類的純虛函數,否則,派生類也變成了抽象類,不能實例化對象。
函數覆蓋和隱藏:
class base
{
public:
virtual void fn();
};
class derived:public base
{
public:
void fn(int a);
};
class derived2:public base
{
public:
void fn();
};
derived類中的fn(int)函數隱藏了base類中的fn()函數,derived類fn(int)函數不是虛函數。derived2類的fn()函數隱藏了derived類的fn(int)函數,由於derived2類的fn()和base類的fn()函數具有同樣的函數名和參數列表,因此derived2的fn()函數是一個虛函數,覆蓋了base類的fn()函數。注意在derived2中,base的fn()函數是不可見的,但這並不影響fn函數的覆蓋。
構成函數覆蓋的條件:
-
基類函數必須是虛函數(使用virtual關鍵字進行聲明);
-
發生覆蓋的兩個函數要分別位於派生類和基類中;
-
函數名稱與參數列表必須完全相同。
兩種函數隱藏的情況:
-
派生類的函數與基類的函數完全相同,只是基類的函數沒有使用virtual關鍵字。此時基類的函數將被隱藏,而不是覆蓋。
-
派生類的函數與基類的函數同名,但參數列表不同,在這種情況下,不管基類的函數聲明是否有virtual關鍵字,基類的函數都將被隱藏。注意這種情況與函數重載的區別,重載發生在同一個類中。
只要記住:函數的覆蓋式發生在派生類與基類之間,兩個函數必須完全相同,並且都是虛函數,那麼不屬於這種情況的,就是隱藏了。
an example:
#include <iostream>
using namespace std;
class base
{
public:
virtual void xfn(int i)
{
cout<<"base::xfn(int i)"<<endl;
}
void yfn(float f)
{
cout<<"base::yfn(float f)"<<endl;
}
void zfn()
{
cout<<"base::zfn()"<<endl;
}
};
class derived : public base
{
public:
void xfn(int i) //覆蓋了基類的xfn函數
{
cout<<"derived::xfn(int i)"<<endl;
}
void yfn(int c) //隱藏了基類的yfn函數
{
cout<<"derived::yfn(int i)"<<endl;
}
void zfn() //隱藏了基類的zfn函數
{
cout<<"derived::zfn()"<<endl;
}
};
void main()
{
derived d;
base *pb = &d;
derived *pd = &d;
pb->xfn(5);
pd->xfn(5);
pb->yfn(3.14f);
pd->yfn(3.14f);
pb->zfn();
pd->zfn();
}