结合例子如下:
#include "stdafx.h"
#include "iostream"
using namespace std;
class Object
{
public:
virtual void Serialize()
{
cout << "Object::Serialize()\n\n";
}
};
class CDocment : public Object
{
public:
void Func()
{
cout << "CDocment::Func()\n";
Serialize();
}
virtual void Serialize()
{
cout << "CDocment::Serialize()\n\n";
}
};
class CMyDoc : public CDocment
{
public:
virtual void Serialize()
{
cout << "CMyDoc::Serialize()\n\n";
}
};
int main(int argc, char* argv[])
{
CMyDoc myDoc;
CMyDoc* pMyDoc = new CMyDoc();
cout << "Test 1\n";
myDoc.Func();
cout << "Test 2\n";
((CDocment*)(&myDoc))->Func();
cout << "Test 3\n";
pMyDoc->Func();
cout << "Test 4\n";
((CDocment)myDoc).Func();
/*
说明:
CMyDoc继承CDocment所有成员,所以全部调用CDocment::Func
对于Serialize,如果他是非虚函数,则调用CDocment::Serialize
因为是虚函数,所以前三个调用 CMyDoc 里实现的 Serialize
对于第四个,由于是upcasting(向上强制转型),所以对象内容被切割
经过data slicing,myDoc已经等同于CDocment的一个对象,所以...
*/
return 0;
}
输入结果: