《深入浅出MFC》中的不解????

yyhero1 2013-02-18 09:56:21
《深入浅出MFC》中的一段话
BOOL CWnd::CreatEx()
{
PreCreateWindow(cs);
}
函数中调用的PreCreateWindow是虚函数,在CWnd和CFrameWnd之中都有定义。
由于this指针所指的缘故,这里应该调用的是CFrameWnd::PreCreateWindow!

提问:这里在父类中直接调用虚函数,为什么会是调用的派生类的?还有这里所指的“由于this指针所指的缘故”是什么意思?
...全文
320 25 打赏 收藏 举报
写回复
25 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
mlqxj35674 2013-02-22
由于楼主的贴子断章取义,只复制了部分内容,因此据此段代码来讨论“虚函数”、“运行时类别识别”、“多态”等概念是无意义的,请楼主补全代码再来讨论这个问题。 多态,虚函数,runtimeclass都要通过对象实例化来说明,仅凭一个“函数定义”怎么说得清。
  • 打赏
  • 举报
回复
2013-02-22
嗯,这时是调用基类的。
  • 打赏
  • 举报
回复
yyhero1 2013-02-21
引用 19 楼 lm841984 的回复:
引用 楼主 yyhero1 的回复:《深入浅出MFC》中的一段话 BOOL CWnd::CreatEx() { PreCreateWindow(cs); } 函数中调用的PreCreateWindow是虚函数,在CWnd和CFrameWnd之中都有定义。 由于this指针所指的缘故,这里应该调用的是CFrameWnd::PreCreateWindow! ……
顺便问下这个问题:基类a 派生了b,b派生了c,函数f()是基类a的虚函数,且在b,c中都改写了函数f(),如果在基类a的成员函数中直接调用f()的话,此时是调用哪个类的虚函数呢?这时应该是调用的基类a的虚函数吧
  • 打赏
  • 举报
回复
yyhero1 2013-02-21
引用 18 楼 lm841984 的回复:
刚看了书中的代码,CreatEx()是非虚函数,是在CFrameWnd类中被调用的,然而CFrameWnd类中没有定义,发现是在基类CWnd中的定义的,this指当前对象。也就是CFrameWnd的一个对象。CreatEx()中的PreCreateWindow()是虚函数,也是在CFrameWnd中被调用的,到这,楼主肯定懂了。
呵呵,我怎么忘了派生类继承了基类的函数这个情况,我真是糊涂了,谢谢你了
  • 打赏
  • 举报
回复
yyhero1 2013-02-21
引用 20 楼 QSCJOB 的回复:
C/C++ code?123456789101112131415161718192021222324252627282930313233343536373839404142#include "stdafx.h"#include <iostream>using namespace std; class CWnd{public: CWnd() { } ……
是这个意思
  • 打赏
  • 举报
回复
QSCJOB 2013-02-21
#include "stdafx.h"
#include <iostream>
using namespace std;

class CWnd
{
public:
	CWnd()
	{

	}
	~CWnd()
	{

	}
	void CreatEx();
	virtual void PreCreateWindow()
	{
		cout << "CWnd::PreCreateWindow" << endl;
	}
};
class CFrameWnd : public CWnd
{
public:
	virtual void PreCreateWindow()
	{
		cout << "CFrameWnd::PreCreateWindow" << endl;
	}
};

void CWnd::CreatEx()
{
	PreCreateWindow();
}

int _tmain(int argc, _TCHAR* argv[])
{
	CFrameWnd mainWnd;
	mainWnd.CreatEx();		// 输出:CFrameWnd::PreCreateWindow
	
	return 0;
}
是不是这个意思?
  • 打赏
  • 举报
回复
2013-02-21
引用 楼主 yyhero1 的回复:
《深入浅出MFC》中的一段话 BOOL CWnd::CreatEx() { PreCreateWindow(cs); } 函数中调用的PreCreateWindow是虚函数,在CWnd和CFrameWnd之中都有定义。 由于this指针所指的缘故,这里应该调用的是CFrameWnd::PreCreateWindow! 提问:这里在父类中直接调用虚函数,为……
另外,如何函数不是static的,不能说类直接调用莫函数,书中的代码,意思是子类对象调用自己的CreatEx()函数,但函数的定义在父类中。
  • 打赏
  • 举报
回复
2013-02-21
刚看了书中的代码,CreatEx()是非虚函数,是在CFrameWnd类中被调用的,然而CFrameWnd类中没有定义,发现是在基类CWnd中的定义的,this指当前对象。也就是CFrameWnd的一个对象。CreatEx()中的PreCreateWindow()是虚函数,也是在CFrameWnd中被调用的,到这,楼主肯定懂了。
  • 打赏
  • 举报
回复
信阳毛尖 2013-02-20
引用 16 楼 yyhero1 的回复:
引用 15 楼 lsq19871207 的回复:如果在基类a的成员函数中直接调用f()的话 ---------------------------------------- 调用的是基类a的f() 如果这样: C/C++ code?12345a* pA = (a*)(new b);if(pA){ PA->f(); //此时调用的是b类的f()} 如……
关键是怎么调用的问题,如果是通过 用基类的指针或者引用指向派生类对象来调用,就是调派生类的(前提是重写了),否则就是各调各的(虚析构函数除外) 至于侯捷是怎么说的,估计是没怎么说清楚吧
  • 打赏
  • 举报
回复
yyhero1 2013-02-19
引用 7 楼 tiger9991 的回复:
怪了,我怎么感觉PreCreateWindow调用的是父类的?
大侠,我好羡慕你的勋章呀
  • 打赏
  • 举报
回复
yyhero1 2013-02-19
引用 4 楼 rxguoblp 的回复:
这里在父类中直接调用虚函数,为什么会是调用的派生类的? 答案应该是不一定。若果在CFrameWnd类中对函数PreCreateWindow(cs)进行重载的话,调用的就应该是CFrameWnd::PreCreateWindow(cs);如果在派生类中没有重载,那么仍然会使用基类CWnd当中的函数。
为什么派生类改写了虚函数,调用就要调用派生类的而不是基类的呢?这里的虚函数是直接调用的啊,这里是怎么实现多态的呢
  • 打赏
  • 举报
回复
傻X 2013-02-19
怪了,我怎么感觉PreCreateWindow调用的是父类的?
  • 打赏
  • 举报
回复
晴天恋 2013-02-19
呵呵,::这个是调用api函数的。this是调用当前。
  • 打赏
  • 举报
回复
jimette 2013-02-19
函数中调用的PreCreateWindow是虚函数, 最好是下个断点跟进去看是调用谁的!
  • 打赏
  • 举报
回复
yyhero1 2013-02-19
引用 15 楼 lsq19871207 的回复:
如果在基类a的成员函数中直接调用f()的话 ---------------------------------------- 调用的是基类a的f() 如果这样: C/C++ code?12345a* pA = (a*)(new b);if(pA){ PA->f(); //此时调用的是b类的f()}
如果在基类中调用f(),是调用的基类,那么和侯捷的调用派生类不是矛盾了么????
  • 打赏
  • 举报
回复
rxguoblp 2013-02-19
这里在父类中直接调用虚函数,为什么会是调用的派生类的? 答案应该是不一定。若果在CFrameWnd类中对函数PreCreateWindow(cs)进行重载的话,调用的就应该是CFrameWnd::PreCreateWindow(cs);如果在派生类中没有重载,那么仍然会使用基类CWnd当中的函数。
  • 打赏
  • 举报
回复
信阳毛尖 2013-02-19
如果在基类a的成员函数中直接调用f()的话 ---------------------------------------- 调用的是基类a的f() 如果这样:

a* pA = (a*)(new b);
if(pA)
{
    PA->f();   //此时调用的是b类的f()
}
  • 打赏
  • 举报
回复
yyhero1 2013-02-19
引用 12 楼 VisualEleven 的回复:
函数中调用的PreCreateWindow是虚函数,在CWnd和CFrameWnd之中都有定义。 由于this指针所指的缘故,这里应该调用的是CFrameWnd::PreCreateWindow! -------------------------- C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override……
大侠,这里调用虚函数并没有用指针和对象引用啊,而是直接就调用虚函数了,直接调用难道就是这样:派生类改写了虚函数就调用派生类的,如果没有改写就调用基类的,这和用基类指针调用是一样的嘛??? 还有一个问题:基类a 派生了b,b派生了c,函数f()是基类a的虚函数,且在b,c中都改写了函数f(),如果在基类a的成员函数中直接调用f()的话,此时是调用哪个类的虚函数呢?是b,还是c呢???b,c可是都改写了f()的!!!
  • 打赏
  • 举报
回复
信阳毛尖 2013-02-19
用基类的指针或者引用指向派生类对象 --------------------------------------- 如果这样的话,自然是调用派生类的(如果派生类重写了话)
  • 打赏
  • 举报
回复
Eleven 2013-02-19
函数中调用的PreCreateWindow是虚函数,在CWnd和CFrameWnd之中都有定义。 由于this指针所指的缘故,这里应该调用的是CFrameWnd::PreCreateWindow! -------------------------- C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override)。C++多态说的不就是是用基类的指针或者引用指向派生类对象,当调用该虚函数的时候,实际上是调用派生类的实现(如果派生类重写了话,如果没有重写当然就调用基类的实现了)。
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
VC/MFC
加入

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
申请成为版主
帖子事件
创建了帖子
2013-02-18 09:56
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……