// deepMFC.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#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 fun() { 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"<<endl;}};

int _tmain(int argc, _TCHAR* argv[])
{
CMyDoc mydoc;
CMyDoc* pmydoc = new CMyDoc;
cout<<"#1 tessting"<<endl;
mydoc.fun();
cout<<"#2 testing"<<endl;
((CDocument*)(&mydoc))->fun();
cout<<"#3 testing "<<endl;
pmydoc->fun();
cout<<"#4 testing "<<endl;
//由于((CDocument)mydoc).fun() 是个传值而非传地址动作,编译器以所谓的建构式把CDocument对象内容复制了一份,使得mydoc中的vtable与CDocument中的vtable一样,
((CDocument)mydoc).fun(); //经过所谓data slicing,本例的mydoc真正变成了一个完完全全的CDocument
//物件,
getchar();
return 0;
}

 

posted on 2013-06-19 09:26  stay hungry!  阅读(156)  评论(0)    收藏  举报