《VC++深入詳解》學習筆記

創建一個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();
 }


 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章