为什么子类要调用父类的同名成员函数?

worldcup 2003-09-29 01:05:51

void CMyTestView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

AfxMessageBox("test");
CView::OnRButtonDown(nFlags, point); //为什么要加此句,去掉后
//也可以正常运行.
}


//c++没理解好就用vc++开发,有难度啊!
...全文
706 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldcup 2003-09-29
  • 打赏
  • 举报
回复
up
worldcup 2003-09-29
  • 打赏
  • 举报
回复
tks all!
有点明白了!
To Wolf0403(完美废人):对于OnRButtonDown等方法,保留与删除CView::OnRButtonDown(nFlags, point); 结果是一样的

To : DaNiao(鸿雁):"唯一的例外是OnDraw之类的函数一定别去调基类的函数,因为基类函数的功能是画一个白板" 我试了一下:

void CMyTestView::OnDraw(CDC* pDC)
{

CMyTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(100,100,"aaabbb");

CView::OnDraw(pDC); //-------(1)
// TODO: add draw code for native data here
}
//我添加了(1)句,但还是显示"aaabbb"而不是"白板"
liao2001 2003-09-29
  • 打赏
  • 举报
回复
标准答案:
hehe
Wolf0403 2003-09-29
  • 打赏
  • 举报
回复
楼上的:不用感叹了,和默认构造函数无关。
MFC 自身包含了一系列默认操作处理过程。如果需要那些基本功能,就应该调用基类的相应方法。你可以把这个句子保留/删除测试两遍就知道了。
玄豹 2003-09-29
  • 打赏
  • 举报
回复
默认的处理方式!
即默认的构造函数!
loveghb 2003-09-29
  • 打赏
  • 举报
回复
不懂VC,但是这个问题其实很容易的。
因为子类具有父类的某些行为,然后子类又不想全部重写。
所以就这样子写了。
建议看看《设计模式》,你面讲了很多,绝好的书!

liao2001 2003-09-29
  • 打赏
  • 举报
回复
我也来灌灌先!

比如现在你自行开发了一个按钮基类,同可以实现按钮的显示,现在你为了满足新的需求,想另写一个按钮类:
法一:写个全新的按钮类,当然按钮的显示也得重写了。
法二:从原来的按钮类派生新类,然后按钮的显示就可以重用了,新的类只要提供个简单的接口,接口中调用老按钮的显示,这样多省事;当然你也可以新写一个显示的接口,可这样一来继承的意义就不大了,还代码重用个屁呀!
worldcup 2003-09-29
  • 打赏
  • 举报
回复
谢谢大家的热情相助!但我还是不太明白,大家能不能讲一下原理方面的内容或举一个例子说明一下mfc中什么时候必须要使派生类调用父类的同名函数!
ezhou 2003-09-29
  • 打赏
  • 举报
回复
单就你的这个函数来看,加与不加没有什么区别;
cnxiaohai 2003-09-29
  • 打赏
  • 举报
回复
在派生类中定义了和父类同名的函数后

会把父类的覆盖掉

上面的是加入了子类的功能

这就是父子关系
DaNiao 2003-09-29
  • 打赏
  • 举报
回复
MFC里的大部分成员函数都应该调用基类的对应函数
以便做一些默认的基本的操作
比如你如果是接收一个这样的消息,并且让它弹出一个MessageBox
那的确不用做什么事情

如果你接的是按钮上的鼠标左键消息,
那你就有可能要MFC为你做一些别的工作:
比如重绘按钮,让它看上去是按下去了,还有发送按钮对应的消息(如果你定义了的话)

在大多数情况下你都应该调用基类的成员函数
因为这样一般不会有副作用,而如果你不调用,则有可能使你的程序不能正常运转
唯一的例外是OnDraw之类的函数一定别去调基类的函数,因为基类函数的功能是画一个白板

VC在生成代码的时候会在程序里加注释告诉你要不要调用基类的函数,以及怎么调
siriuscor 2003-09-29
  • 打赏
  • 举报
回复
在派生类中定义了和父类同名的函数后,会把父类的覆盖掉,上面的是加入了子类的功能.
worldcup 2003-09-29
  • 打赏
  • 举报
回复
谢谢楼上,这么问吧:用与不用CView::OnRButtonDown(nFlags, point);一句会有什么区别?到底是用自己的处理方式呢还是由父类进行默认处理
sevecol 2003-09-29
  • 打赏
  • 举报
回复
CView::OnRButtonDown应该是默认的处理方式,你的派生类可以增加自己的处理方式,也可以交由父类进行默认处理

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧