((类名)对象名)->函数名 C++中怎么理解 例如:mfc中((CDocument)mydoc).fuc()或者((CDocument*)(&mydo
例如:mfc中((CDocument)mydoc).fuc()或者((CDocument*)(&mydoc)->fuc()分别怎么理解。。急求在线等。。。...
例如:mfc中((CDocument)mydoc).fuc()或者((CDocument*)(&mydoc)->fuc()分别怎么理解。。急求在线等。。。
展开
展开全部
天壤之别!尤其是涉及到C++中的多态特性时。(你提到了MFC,多态性肯定是逃不掉了,呵呵。)
侯sir的经典《深入浅出MFC》的第二章中提到过一点,但只是一带而过,没有很详细地给出解释。
(CDocument)mydoc这条语句的意思是,将mydoc强制转换为一个CDocument对象,mydoc你没说出它是哪个类的对象。按MFC惯例,应该是CDocument的一个派生类的对象。
语句简简单单,但涉及的动作却很多。它会导致CDocument的拷贝构造函数的执行,拷贝构造函数会创建一个全新的临时的CDocument类型的对象,暂且叫它tempCDoc吧;然后将mydoc的CDocument部分复制给tempCDoc。所以这条语句等于是创建了一个全新的CDocument对象,不过是临时的。到此,就和mydoc全无关系了,它调用成员函数时,总是CDocument的成员函数。而且,上面是通过"."来调用fuc()的,根本谈不上多态。
说简单点,你把((CDocument)mydoc)直接看成一个CDocument的对象就可以了,不要管mydoc是什么东西。
第二个语句就和第一条截然不同。在C++中是可以用派生类对象或其地址去给基类的引用或指针赋值的,所以用&对mydoc取地址后,可以直接转换为CDocument *,即指向CDocument对象的指针。当然,这个指针实际指向的东西其实是mydoc,它是个派生类的对象(这里就没有什么拷贝构造函数调用、临时对象这些乱七八糟的)。如果在CDocument中,fuc是个虚函数,派生类又对它override了,那((CDocument*)(&mydoc)->fuc()其实是调用了派生类的版本;又或者fuc不是虚函数,但它的函数体里调用了CDocument及其派生类都定义了的虚函数的话,结果还是调用派生类的版本。这里就涉及到了多态。
MFC里面大量用到了C++里面的多态机制,甚至可以说,没有多态就没法使用MFC,因为你去继承了MFC定义的类后,去哪里添加自己的处理动作呢?
提个小建议,我觉得要学MFC,首先要对C++的继承、多态这些机制了解一下,要不然,学习过程会痛苦不堪。有时间的话,推荐你研究下侯俊杰的《深入浅出MFC第二版》 :-)
侯sir的经典《深入浅出MFC》的第二章中提到过一点,但只是一带而过,没有很详细地给出解释。
(CDocument)mydoc这条语句的意思是,将mydoc强制转换为一个CDocument对象,mydoc你没说出它是哪个类的对象。按MFC惯例,应该是CDocument的一个派生类的对象。
语句简简单单,但涉及的动作却很多。它会导致CDocument的拷贝构造函数的执行,拷贝构造函数会创建一个全新的临时的CDocument类型的对象,暂且叫它tempCDoc吧;然后将mydoc的CDocument部分复制给tempCDoc。所以这条语句等于是创建了一个全新的CDocument对象,不过是临时的。到此,就和mydoc全无关系了,它调用成员函数时,总是CDocument的成员函数。而且,上面是通过"."来调用fuc()的,根本谈不上多态。
说简单点,你把((CDocument)mydoc)直接看成一个CDocument的对象就可以了,不要管mydoc是什么东西。
第二个语句就和第一条截然不同。在C++中是可以用派生类对象或其地址去给基类的引用或指针赋值的,所以用&对mydoc取地址后,可以直接转换为CDocument *,即指向CDocument对象的指针。当然,这个指针实际指向的东西其实是mydoc,它是个派生类的对象(这里就没有什么拷贝构造函数调用、临时对象这些乱七八糟的)。如果在CDocument中,fuc是个虚函数,派生类又对它override了,那((CDocument*)(&mydoc)->fuc()其实是调用了派生类的版本;又或者fuc不是虚函数,但它的函数体里调用了CDocument及其派生类都定义了的虚函数的话,结果还是调用派生类的版本。这里就涉及到了多态。
MFC里面大量用到了C++里面的多态机制,甚至可以说,没有多态就没法使用MFC,因为你去继承了MFC定义的类后,去哪里添加自己的处理动作呢?
提个小建议,我觉得要学MFC,首先要对C++的继承、多态这些机制了解一下,要不然,学习过程会痛苦不堪。有时间的话,推荐你研究下侯俊杰的《深入浅出MFC第二版》 :-)
展开全部
强制类型转换,都是将mydoc强制成CDocument,差别在于调用成员函数的方式是不同,第二个指针调用
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
CDocument时文档类的积累,mydoc时他的派生类,(CDocument)mydoc把派生类强制转换成积基类,然后条用基类的方法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-03-24
展开全部
是不是CDocument类是mydoc的基类啊?这样的话((CDocument)mydoc).fuc()或者((CDocument*)(&mydoc)->fuc()调用的是 基类CDocument中的fuc()而不是mydoc的类中的fuc()
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询