C++ 进阶——object slicing 与虚函数与dynamic_cast

C++基础——C++风格的类型转换(static_cast、const_cast、dynamic_cast、reinterpret_cast)

只有再做向上转型(upcast)的动作时,才存在对象切割(object slicing),子类的内存空间显然要大于父类的嘛,切割即是保留从父类继承而来的,切除子类所独有的。

  • (1)object slicing 对象切割是向上转型(转换为父类)
  • (2)dynamic_cast<子类指针/子类引用> 是向下转型(转换为子类指针或子类引用)
#include 
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()

你可能感兴趣的:(C/C++)