创建一个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();
}