首页 > MFC开发 > Object Slicing与虚函数

Object Slicing与虚函数

终于回到家里了,在此不禁要感慨一下“春运”的神奇。在家里没什么事,就看点书吧,可是东西太多,书带一两本就够了,带多了也没看,想来想去,最终带了侯捷的《深入浅出MFC》(这本书实在淘宝上淘来的D版,买D版是因为考虑到这本书太老了,买了一年多了,一直没有看,想到平时多少还是要用点MFC,并且还要看看ATL,所以还是翻一翻吧),另一本是李开复的自传《世界因你不同》,也是买了好久了一直没有看。(因为好多书买了没看,所以我控制住自己今年下半年只买了新版的0day安全)

《深入浅出MFC》的前面两张基本上没有什么看头,快速的翻了一下,在看第三章时发现有的地方弄错了,就回过头来看了下第二章讲的一个知识点:Object Slicing与虚函数。直接贴代码吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
using namespace std;
 
class CObject
{
public:
	virtual void Serialize() { cout << "CObject::Serialize()\n\n"; }
};
 
class CDocument : public CObject
{
public:
	int m_data1;
	void func()
	{
		cout << "CDocument::func()" << endl;
		Serialize();
	}
	virtual void Serialize() { cout << "CDocument::Serialize()\n\n"; }
};
 
class CMyDoc : public CDocument
{
public:
	int m_data2;
	virtual void Serialize(){ cout << "CMyDoc::Serialize()\n\n"; }
};
 
int main(int argc, char **argv)
{
	CMyDoc mydoc;
	CMyDoc* pmydoc = new CMyDoc;
 
	cout << "#1 testing" << endl;
	mydoc.func();
 
	cout << "#2 testing" << endl;
	((CDocument *)(&mydoc))->func();
 
	cout << "#3 testing" << endl;
	pmydoc->func();
 
	cout << "#4 testing" << endl;
	((CDocument)mydoc).func();
 
	return 0;
}

《深入浅出MFC》读书笔记:object slicing与虚函数

  • 因为CMyDoc没有自己的func函数,所以都是调用了它的父类CDocument的func函数。
  • func中调用的Serialize函数是CMyDoc自己的函数(这种子类调用从父类继承下来的普通函数中再调用虚函数的方法以前没见过),因为Serialize是个虚函数且CMyDoc重新定义了这个virtual function。
  • 第四种情况中调用的Serialize函数是CDocument的函数,因为这里的强制转换操作是的构造了一个临时的CDocument对象,且这个对象是从CMyDoc类型的对象切割而来的,通过对象的vptr调用的虚函数就是自己的虚函数了。

第三章看起来比较有挑战,不过新的东西看起来不是那么枯燥。


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> Object Slicing与虚函数
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. 2012年1月14日13:48 | #1

    我回家一本书都没带
    还是电子书给力[em022]

    [回复]

  2. 2012年1月14日13:51 | #2

    其实你可以去研究duilib的源码和文档
    MFC里面好多机制都陈旧了

    [回复]

    代码疯子 回复:

    @C瓜哥, 暂时不看那个了。应用层的打算看下ATL/COM。电子书太伤眼了

    [回复]

    C瓜哥 回复:

    @代码疯子,
    要习惯看电子版的吧,因为不是所有东西都可以印刷成书,或者打印出来的

    [回复]

  3. 2012年1月14日14:12 | #3

    之前看过,侯捷写技术书像散文一样很不错的。
    C++的类型转换有专门的dynamic_cast和static_cast比较安全点:)

    [回复]

    代码疯子 回复:

    @波波, 嗯,一般也不会向上转型

    [回复]

  4. 2012年1月15日16:22 | #4

    陪我来一起完qt吧 [em012]

    [回复]

    代码疯子 回复:

    @Tanky Woo, 呵呵,QT还算不错啊,不过我没打算玩QT。

    [回复]

  5. 2012年1月15日18:05 | #5

    我从深圳 挤回来了。。17号去武汉,20号还要挤 回 重庆。。。

    [回复]

    代码疯子 回复:

    @tl3shi, 去武汉干什么?那么晚才回去?

    [回复]

  6. 竹子
    2012年3月1日01:46 | #6

    我觉得你对第四种情况解释得不够清楚,第四种情况之所以输出的是CDocument是因为发生的是静态绑定,才是那个结果,呵呵

    [回复]

    代码疯子 回复:

    @竹子, 静态绑定不是针对非虚函数而言的吗?

    [回复]

    竹子 回复:

    @代码疯子, 在编译时期就确定类型不就可以叫静态绑定吗?虚函数不只是实现动态绑定的条件之一吗?实现动态绑定的另一个条件不是是调用虚函数的对象必须是指针或引用吗?第四种情况不满足动态绑定的第二个条件,这就是我认为你说的不够清楚的原因了,呵呵

    [回复]

    代码疯子 回复:

    @竹子, [em022] absolutely

    [回复]