// CObject.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
class CObject
{
public:
virtual void Serialize(){
std::cout<<"CObject::Serialize()\n\n";
}
protected:
private:
};
class CDocument:public CObject
{
public:
int m_data1;
void fun(){std::cout<<"CDocument::func()"<<std::endl;
Serialize();
}
virtual void Serialize(){std::cout<<"CDocument::Serialize()\n\n";}
protected:
private:
};
class CMyDoc:public CDocument
{
public:
int m_data2;
virtual void Serialize(){std::cout<<"CMyDoc::Serialize()\n\n";}
protected:
private:
};
//----------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
CMyDoc mydoc;
CMyDoc *pmydoc=new CMyDoc;
std::cout<<"#1 testing"<<std::endl;
mydoc.fun();//CDocument::func() ,CMyDoc::Serialize()
std::cout<<"#2 testing"<<std::endl;
((CDocument*)(&mydoc))->fun();//CDocument::Serialize() CDocument::Serialize() //错了
std::cout<<"#3 testing"<<std::endl;
pmydoc->fun();//CDocument::func() ,CMyDoc::Serialize()
std::cout<<"#4 testing"<<std::endl;
((CDocument)mydoc).fun();//CDocument::Serialize() CDocument::Serialize()
getchar();
return 0;
}
说明:
派生类对象通常都比基础对象大(内存空间),因为派生对象不但继承其基类的成员,又有自己的成员,
那么所谓的向上强制转型:(CDocument)mydoc,将会造成对象的内容被切割(object slicing)。
通过内容切割,mydoc真正变成了一个完完全全的CDocument对象。