■虚函数、函数重载与静态函数问题
我们经常看到,在重载函数或子类虚函数中的最后一条语句都是
调用父类的该函数。
如重载函数的情况:
void CMyView::OnChar(....)
{
.....
CView::OnChar(...);
}
如虚函数的情况:
BOOL CMainFrame::OnCommand(....)
{
.....
return CFrameWnd::OnCommand(....);
}
但据我所知 CClass::Function()的调用方式是在 Function()是static函数的情况。
而我查MSDN,OnChar,OnCommand都不是静态函数,那为什么可以这样调用呢?
问题点数:10、回复次数:6Top
1 楼wangyangcheng(矛盾)回复于 2005-04-02 21:05:43 得分 0
这是指名道姓地调用所指定的类的成员函数。Top
2 楼mscf(扎西特勒)回复于 2005-04-02 21:08:24 得分 0
静态函数是在没有类实例时就能使用它的代码,所以才那么用,在return CFrameWnd::OnCommand(....);这儿可以理解为名字空间Top
3 楼lwjwj1314()回复于 2005-04-02 21:13:24 得分 0
我用简单的程序表现了上边的问题:
#include <iostream.h>
class Base
{
public:
void refunc()
{
cout<<"Base refunc"<<endl;
}
virtual void vfunc()
{
cout<<"Base vfunc"<<endl;
}
};
class Derive
{
public:
virtual void vfunc()
{
cout<<"Derive vfunc"<<endl;
Base::vfunc();
}
void refunc()
{
cout<<"Derive refunc"<<endl;
Base::refunc();
}
};
int main()
{
return 0;
}
程序报错:
error C2352: 'Base::vfunc' : illegal call of non-static member function
see declaration of 'vfunc'
error C2352: 'Base::refunc' : illegal call of non-static member function
see declaration of 'refunc'
Top
4 楼lwjwj1314()回复于 2005-04-02 21:14:52 得分 0
wangyangcheng(矛盾),mscf(扎西特勒)两位说是名字空间:
那程序如何知道什么时侯是名字空间,什么时候是类名呢?Top
5 楼lwjwj1314()回复于 2005-04-02 21:17:23 得分 0
定义名字空间:
#include <iostream.h>
namespace Base
{
class Base
{
public:
void refunc()
{
cout<<"Base refunc"<<endl;
}
virtual void vfunc()
{
cout<<"Base vfunc"<<endl;
}
};
};
class Derive
{
public:
virtual void vfunc()
{
cout<<"Derive vfunc"<<endl;
Base::vfunc();
}
void refunc()
{
cout<<"Derive refunc"<<endl;
Base::refunc();
}
};
int main()
{
return 0;
}
报错:
error C2039: 'vfunc' : is not a member of 'Base'
error C2039: 'refunc' : is not a member of 'Base'
因此,MFC是怎么实现识别名字空间,还是类名呢?
Top
6 楼virtualfunction(virtualfunction)回复于 2005-04-02 21:51:58 得分 10
1、强制调用“基类”虚函数。
void CMyView::OnChar(....)
{
.....
CView::OnChar(....);<---CMyView基类CView的虚函数
}
BOOL CMainFrame::OnCommand(....)
{
.....
return CFrameWnd::OnCommand(....); <---CMainFrame基类CFrameWnd的虚函数
}
2、你的错误!
class Derive
{
public:
.............
void refunc()
{
cout<<"Derive refunc"<<endl;
Base::refunc();<---refunc并不是名字空间Base的成员,而是名字空间Base
中类Base的成员函数。
};
.............
};
3、下列是MFC的作法
class Derive :public Base <----继承
{
public:
virtual void vfunc()
{
cout<<"Derive vfunc"<<endl;
Base::vfunc(); <-----强制调用基类虚函数
};
void refunc()
{
cout<<"Derive refunc"<<endl;
Base::refunc(); <-----强制调用基类虚函数
};
};
Top




