对象切割 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");
}
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");
}