当设计类或者扩展类的层次关系时,编程者往往需要定义或者重载虚函数。许多虚函数需要调用基类的函数。例如:
class CExplorerView
: public CView
{
. . .
/* 虚 */ void OnCreate()
{
CView::OnCreate();
/* 你自己编写的代码 */
}
};
当一个类需要处理多个用户事件时(例如,从MFC类导出的类),它会有许多虚函数。在绝大多数情况下,你还是需要调用基类函数。
其他开发者使用你编写的代码时,他/她可能会认为有必要让这个类再继承另一个基类(例如,为了增强功能),这时问题就不期而遇了。
除了需要更换基类的名字外,使用你的代码的开发者还需要把类中所有对原先基类函数的调用更换为对新基类函数的调用,当他/她忽略哪怕是一个地方的替换,错误就产生了。当处理模板(基类是一个模板类)时,情况会尤为恶劣。下面是一个例子:
class CExplorerView
: public CFormView
{
. . .
/* 虚 */ void OnCreate()
{
/*** 错误:应该调用CFormView::OnCreate()***/
CView::OnCreate();
/* 你自己编写的代码 */
}
};
对像上面例子那样的类,可以用typedef来处理基类。当需要调用基类函数时,你只需要在函数名前加上前缀base_class,问题便迎刃而解了。当需要更换基类时,你只需要更改一行代码:
class CExplorerView
: public CFormView
{
/* OLD LINE: typedef CView base_class; */
typedef CFormView base_class;
. . .
/* 虚 */ void OnCreate()
{
base_class::OnCreate();
/* 你自己编写的代码 */
}
};
上面这个例子是导出类只有一个基类的情况,如果你处理的导出类有多个基类,你可以把它们typedef成不同的名称,如base_view_class、base_state_class等等。