C++虚函数Demo - Win32 版本
生活随笔
收集整理的這篇文章主要介紹了
C++虚函数Demo - Win32 版本
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
通過基類指針只能訪問派生類的成員變量,但是不能訪問派生類的成員函數。
為了消除這種情況,讓基類指針能夠訪問派生類的成員函數,C++ 增加了虛函數(Virtual Function)。使用虛函數,需要在函數聲明前面增加 virtual 關鍵字。
#include <windows.h> #include "resource.h" #include <string>using namespace std;char szBuffer[100]; //基類People class People{ public:People(char *name, int age);virtual void display(HDC hdc); //聲明為虛函數 protected:char *m_name;int m_age; }; People::People(char *name, int age): m_name(name), m_age(age){} void People::display(HDC hdc){wsprintf(szBuffer, "%s今年%d歲了,是個無業游民。",m_name,m_age);TextOut(hdc,10,30,szBuffer,lstrlen(szBuffer));} //派生類Teacher class Teacher: public People{ public:Teacher(char *name, int age, int salary);virtual void display(HDC hdc); //聲明為虛函數 private:int m_salary; }; Teacher::Teacher(char *name, int age, int salary): People(name, age), m_salary(salary){} void Teacher::display(HDC hdc){wsprintf(szBuffer, "%s今年%d歲了,是一名教師,每月有%d元的收入",m_name,m_age,m_salary);TextOut(hdc,10,80,szBuffer,lstrlen(szBuffer)); }LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);HINSTANCE hInst; TCHAR szClassName[] = TEXT("virtfDemo");int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil) {HWND hwnd;MSG messages;WNDCLASSEX wincl;hInst = hThisInstance;wincl.hInstance = hThisInstance;wincl.lpszClassName = szClassName;wincl.lpfnWndProc = WindowProcedure;wincl.style = CS_DBLCLKS;wincl.cbSize = sizeof (WNDCLASSEX);wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);wincl.hCursor = LoadCursor (NULL, IDC_ARROW);wincl.lpszMenuName = MAKEINTRESOURCE (IDC_VIRTFDEMO);wincl.cbClsExtra = 0;wincl.cbWndExtra = 0;wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);if (!RegisterClassEx (&wincl))return 0;hwnd = CreateWindowEx (0,szClassName,TEXT("C++虛函數Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,200,HWND_DESKTOP,NULL,hThisInstance,NULL);ShowWindow (hwnd, nFunsterStil);while (GetMessage (&messages, NULL, 0, 0)){TranslateMessage(&messages);DispatchMessage(&messages);}return messages.wParam; }LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {PAINTSTRUCT ps;HDC hdc;RECT rt; char szBuffer[100]; People *p = new People("王不二", 23);switch (message){case WM_COMMAND:switch (LOWORD(wParam)){case IDM_virtf:hdc=GetDC(hwnd);p -> display(hdc);p = new Teacher("趙杰杰", 45, 9000);p -> display(hdc);break;case IDM_ABOUT:MessageBox (hwnd, TEXT ("virtfDemo v1.0\nCopyright (C) 2020\n by bo"),TEXT ("virtfDemo"), MB_OK | MB_ICONINFORMATION);break;case IDM_EXIT:DestroyWindow(hwnd);break;default:return DefWindowProc(hwnd, message, wParam, lParam); }break;case WM_CREATE:break;case WM_PAINT:hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rt); EndPaint(hwnd, &ps);break;case WM_DESTROY:PostQuitMessage (0);break;default:return DefWindowProc (hwnd, message, wParam, lParam);}return 0; }例子中,可以通過 p 指針調用 Teacher 類的成員函數,運行結果也證明了這一點(趙杰杰已經是一名老師了,不再是無業游民)。
有了虛函數,基類指針指向基類對象時就使用基類的成員(包括成員函數和成員變量),指向派生類對象時就使用派生類的成員。換句話說,基類指針可以按照基類的方式來做事,也可以按照派生類的方式來做事,它有多種形態,或者說有多種表現方式,這就是 多態(Polymorphism)。
同樣是p->display();這條語句,當 p 指向不同的對象時,它執行的操作是不一樣的。同一條語句可以執行不同的操作,看起來有不同表現方式,這就是多態。
多態是面向對象編程的主要特征之一,C++中虛函數的唯一用處就是構成多態。
工程;
資源和頭文件;
#include "resource.h" #include <windows.h>/ // // Menu //IDC_VIRTFDEMO MENU BEGINPOPUP "&File"BEGINMENUITEM "C++虛函數", IDM_virtfMENUITEM "E&xit", IDM_EXITENDPOPUP "&Help"BEGINMENUITEM "&About ...", IDM_ABOUTEND END #define IDM_EXIT 10001 #define IDM_ABOUT 10002#define IDC_VIRTFDEMO 10101 #define IDD_ABOUTBOX 10102 #define IDM_virtf 40001?
總結
以上是生活随笔為你收集整理的C++虚函数Demo - Win32 版本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 词法分析器和lex工具基本学习
- 下一篇: DirectX Shader 入门学习