C++基础——C++风格的类型转换(static_cast、const_cast、dynamic_cast、reinterpret_cast)
只有再做向上转型(upcast)的动作时,才存在对象切割(object slicing),子类的内存空间显然要大于父类的嘛,切割即是保留从父类继承而来的,切除子类所独有的。
- (1)object slicing 对象切割是向上转型(转换为父类)
- (2)dynamic_cast<子类指针/子类引用> 是向下转型(转换为子类指针或子类引用)
#include <iostream>
using namespace std;
class CDocument
{
public:
void func()
{
cout << "CDocument::func() " << endl;
Serialize();
}
virtual void Serialize()
{
cout << "CDocument::Serialize()" << endl;
}
};
class CMyDocument:public CDocument
{
public:
virtual void Serialize()
{
cout << "CMyDocument::Serialize()" << endl;
}
};
int main(int, char**)
{
CMyDocument myDoc;
((CDocument*)&myDoc)->func();
// 基类指针指向派生类对象
// 不是向上转型
cout << "==================================" << endl;
((CDocument)myDoc).func();
// myDoc 对象强转为 CDocument,向上转型,
// 派生类的特有成员会丢失
// 完完全全将派生类对象转换类基类对象(将派生类对象拷贝构造为基类对象)
// dynamic_cast<>();
return 0;
}
运行结果如下:
CDocument::func()
CMyDocument::Serialize()
==================================
CDocument::func()
CDocument::Serialize()