许明会的计算机技术主页

Language:C,C++,.NET Framework(C#)
Thinking:Design Pattern,Algorithm,WPF,Windows Internals
Database:SQLServer,Oracle,MySQL,PostSQL
IT:MCITP,Exchange,Lync,Virtualization,CCNP

导航

对象切割 ObjectSlicing

/*
 Test ONE:
CDocument::func()
CMyDoc::Serialize()
Test TWO:
CDocument::func()
CMyDoc::Serialize()
Test Three:
CDocument::func()
CMyDoc::Serialize()
Test Four:
CDocument::func()
CDocument::Serialize()   
 
*/
#include <iostream>
using namespace std;

class CObject
{
public:
    virtual void Serialize(){ cout << "CObject::Serialize() \n"; }
};

class CDocument : public CObject
{
public:
    int m_data1;
    void func(){
        cout << "CDocument::func()" << endl;
        Serialize();
    }
    void Serialize(){ cout << "CDocument::Serialize() \n"; }
};

class CMyDoc : public CDocument
{
public:
    int m_data2;
    virtual void Serialize(){ cout << "CMyDoc::Serialize()" << endl; }
};

void main()
{
    CMyDoc mydoc;//感觉这仅仅是一个声明,为什么居然能呼叫函数
    CMyDoc* pDoc = new CMyDoc; //这里()可有可无

    cout << "Test ONE:" << endl;
    mydoc.func();

    cout << "Test TWO:" << endl;
    ((CDocument*) &mydoc)->func();

    cout <<"Test Three:" << endl;
    pDoc->func();

    cout << "Test Four:" << endl;
    ((CDocument) mydoc).func();

    system("pause");
}

posted on 2010-12-03 09:07  许明会  阅读(248)  评论(0编辑  收藏  举报