C++タイプ変換dynamic_キャスト解析

2336 ワード

C++のタイプ変換には4種類のconst_がありますcast, reinterpret_cast, static_cast, dynamic cast
ここではdynamic castの小さな例を挙げます
#include <iostream>

using namespace std;

class BaseClass{
    public :
    int m_iNum;

    virtual void foo() {}; //        。          dynamic_cast
};

class DerivedClass : public BaseClass{
    public :
    char* m_szName;

    DerivedClass(char* str) {
        m_szName = new char[strlen(str) + 1];
        strcpy(m_szName, str);
    }

    ~DerivedClass(){
        if(m_szName != NULL){
            delete []m_szName;
            m_szName = NULL;
            
        }
    }
    void bar() {};
};

int main() {
    //64   , int:4, vtable_prt:8    16
    cout << "sizeof(BaseClass) = " << sizeof (BaseClass) << endl;
    //64   , 4 + 8 + 8 = 24
    cout << "sizeof(DerivedClass) = " << sizeof (DerivedClass) << endl;

    char *p = "abc";
    BaseClass *pb = new DerivedClass(p);
    cout << "sizeof(*pb): " << sizeof (*pb) << endl; // 16
    
    DerivedClass *pd1 = static_cast<DerivedClass *>(pb); //  ->  ,      ,      
    DerivedClass *pd2 = dynamic_cast<DerivedClass *>(pb); //  ->  ,      ,  

    cout << pd1->m_szName << endl; //abc
    cout << pd2->m_szName << endl; //abc

    cout << "sizeof(*pd1): " << sizeof (*pb) << endl; //16
    cout << "sizeof(*pd2): " << sizeof (*pb) << endl; //16

    BaseClass* pb2 = new BaseClass();
    DerivedClass *pd21 = static_cast<DerivedClass *>(pb2); //  ->  ,      ,  !    m_szName    
    DerivedClass *pd22 = dynamic_cast<DerivedClass *>(pb2); //  ->  ,      ,   。   NULL

    cout << "sizeof(*pd21): " << sizeof (*pb) << endl; //16
    cout << "sizeof(*pd22): " << sizeof (*pb) << endl; //16
    
    cout << pd21 <<endl; //0x7f9a7b403a60
    //     pd21 -> m_szName segmentation fault
    cout<< pd22 <<endl; //0    NULL
    return 0;
}

出力結果:
sizeof(BaseClass) = 16
sizeof(DerivedClass) = 24
sizeof(*pb): 16
abc
abc
sizeof(*pd1): 16
sizeof(*pd2): 16
0x7f9a7b403a60
0
sizeof(*pd21): 16
sizeof(*pd22): 16