C++タイプ変換dynamic_キャスト解析
2336 ワード
C++のタイプ変換には4種類のconst_がありますcast, reinterpret_cast, static_cast, dynamic 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