#include <iostream.h>#include <string.h>class Aves{ public: Aves (); ~Aves (); virtual void tweet(); virtual void run(); virtual void fly(); char m_strHead[10]; char m_strTrunk[10]; char m_strCrura[10]; char m_strWing[10];protected: char m_strBowels[10];};Aves::Aves(){ strcpy(m_strHead, "Head"); strcpy(m_strTrunk, "Trunk"); strcpy(m_strCrura, "Crura"); strcpy(m_strWing, "Wing"); strcpy(m_strBowels, "Bowels"); cout<<"a bird born!"<<endl;}Aves::~Aves(){ cout<<"a bird die!"<<endl;}void Aves::tweet(){ cout<<"jijijijijijiji"<<endl;}void Aves::run(){ cout<<"I can run by "<<m_strCrura<<endl;}void Aves::fly(){ cout<<"I can fly by "<<m_strWing<<endl;}class Ostrich : public Aves{public: void tweet(); void fly();};void Ostrich::tweet(){ cout<<"gugugugugugugu"<<endl;}void Ostrich::fly(){ cout<<"I can''t fly by "<<m_strWing<<endl;}void main(){ { Aves bird; bird.fly(); bird.run(); bird.tweet(); } cout <<"====================="<<endl; { Ostrich aOstrich; aOstrich.fly(); aOstrich.run(); aOstrich.tweet(); Aves *lpBird; lpBird = &aOstrich; lpBird->fly(); }}关于虚函数更具体的情况,请参看vckbase第12期的《解析动态联编》。关于其它C++语法,请自行查看C++教材。 那么MFC类呢?简单地来说,MFC类只是将许多有关联的API函数将其封装在一起。在WinSDK中WinAPI都是一些零零散散的函数,它们大部分中都会有一个参数是它的服务对象的句柄。比如,CreateWindow函数会需要一个句柄输出来返回一个窗口句柄来表达其建立的窗口对象,ShowWindow函数需要一个窗口句柄来指定哪一个窗口要改变显示状态,CloseWindow函数需要一个窗口句柄来指定哪一个窗口要被关闭。可以理解为是句柄在围绕着函数转,句柄在以函数为中心。而MFC是将几个若干有服务关联的函数封装在一起成为成员函数,每一个类会有一个保护的句柄成员变量来保存当前类对象所代表的服务对象,在对外调用上看就可以将其类对象看成其服务对象,这些成员函数就可以看成其服务对象本来固有的方法。在使用上比使用WinAPI更为形象和理解。下面做一个比照的例子.
SDK写法
HWND hCurrentWnd;hCurrentWnd = ::CreateWindow (...);::ShowWindow(hCurrent,SW_SHOW);::CloseWindow(hCurrent);MFC写法
CWnd CurrentWnd;CurrentWnd.CreateWindow (…);CurrentWnd.ShowWindow (SW_SHOW);CurrentWnd.CloseWindow();怎么样,MFC没有枯燥零碎的句柄的概念。我们足可以想象成一个类对象就是一个服务对象,它本身有许多对其控制的方法。这就是制作MFC的主要目的。 所有的MFC类的基类是CObject的。你可以用CObject的指针指代所有MFC类。CWnd类是所有关于窗口的API函数进行了封装。所有的控件都是派生于这个类的如CEdit,CButton,CDialog, CFrameWnd, CMDIFrameWnd, CMDIChildWnd, CView, CDialog等 MFC更深的理论比如消息映射,CRuntimeClass等在《深入浅出MFC》,《C++技术内幕》等书有详细探讨与讲解,强力推荐。我就是看这几本书入的门。MFC类的各个功能也参见MSDN。 下一部分将详细解释一个MFC对话框程序。 下面,我要介绍一下一些C++程序建议编写规范。
一、变、常、参量的建议:
1.常、变量应当定义函数体最前面或一对大括号的最前面,全局常、变量就当放在整个文件的最前面。这样便于管理与维护。
2.声明变、参量的应当使用匈牙利命名法。为变、参量添加适当的前缀,并以有意义的可拼读的名词性英文单词来命名,每个英文语素首字母都应当大写。如: m_nCount;则表示这是一个类的成员,为整型,是用做计数器用的。 常用的前缀有:
前缀 表示内容
_或Afx 表示为全局
m_ 表示为某个类的成员
b 表示为布尔型
h 表示为句柄
c或ch 表示为字符型
l 表示为长型
clr 表示为32位颜色值
n 表示为整型
cx或cy 表示为坐标的水平或垂直值
p或lp 表示为指针
w 表示为字(WORD)型
sz 表示为以0结尾的字符串
str 表示为CString字符型
dw 表示为双字(DWORD)型
3.常量应当用const来定义,而不是用预处理指令#define。并且常量名应当大写。
4.如果是全局的常、变量应当加前缀_。