±×µ¿¾È ¸ðÈ£Çß´ø(ÀúÈ¥ÀÚ ¸ðÈ£.. ¤Ì_¤Ì) C++ÀÇ °¢Á¾ castµé¿¡ ´ëÇؼ­ Á¤¸®Çغ¸¾Ò½À´Ï´Ù. C++Àº C-style-castÀÇ ¹®Á¦Á¡À» º¸¿ÏÇϱâ À§ÇØ ´ÙÀ½°ú °°Àº 4°¡Áö cast¸¦ Áö¿øÇÕ´Ï´Ù. static_cast<>() dynamic_cast<>() const_cast<>() reinterpret_cast<>() <> ¾È¿¡ ŸÀÔÀÌ µé¾î°¡°í ij½ºÆà ÇÏ·Á´Â ŸÀÔÀº ¹Ýµå½Ã µÚ¿¡ °ýÈ£·Î ¹­¾îÁÖ¾î¾ß ÇÕ´Ï´Ù. ============================================================================ =========== static_cast ´Â ÄÄÆÄÀÏ Å¸ÀÓ¿¡ casting ŸÀÔÀ» ¾Ë ¼ö Àִ ŸÀÔµéÀ» casting ÇÒ ¶§ »ç¿ëÇÕ´Ï´Ù. dynamic_cast ´Â hierarchy °¡ ÀÖ´Â class µé »çÀ̸¦ ¿À°¥ ¶§(up, down casting ¸ðµÎ) »ç¿ëÇÕ´Ï´Ù. const_cast ´Â ŸÀÔÀÇ const ¼ºÀ» ¾ø¾Ù ¶§ »ç¿ëÇÕ´Ï´Ù. reinterpret_cast ´Â º° °ü°è ¾ø´Â ŸÀÔµé °£¿¡ castingÀ» ÇØ¾ß ÇÒ ¶§ ŸÀÔ¸¸ ¹Ù²ãÁִµ¥ »ç¿ëÇÕ´Ï´Ù. ============================================================================ =========== C-style-cast == static_cast + reinterpret_cast Á¤µµ·Î º¸½Ã¸é µË´Ï´Ù. dynamic_cast ´Â ¹Ýµå½Ã vtable(virtual function table)ÀÌ Á¸ÀçÇØ¾ß ÇÕ´Ï´Ù. dynamic_cast ´Â vtableÀ» Â÷·Ê·Î µÚÁö±â ¶§¹®¿¡ ½ÇÇà½Ã°£ÀÌ O(N) ÀÔ´Ï´Ù. static_cast ´Â hierarchy°¡ Á¸ÀçÇÏ´Â class µé °£¿¡µµ upcastingÀº °¡´ÉÇÕ´Ï´Ù. (ÄÄÆÄÀÏ Å¸ÀÓ¿¡ ¾Ë ¼ö ÀÖÀ¸¹Ç·Î ´ç¿¬ÇÕ´Ï´Ù.) À̸¦ ¾ð±ÞÇÏ´Â °ÍÀº hierarchy°¡ Á¸ÀçÇÒ ¶§ ¹«Á¶°Ç dynamic_cast¸¦ »ç¿ëÇÏ´Â ¿ì¸¦ ¹üÇÏÁö ¾Ê±â À§ÇÔÀÔ´Ï´Ù. downcastingÀº ´ç¿¬È÷ dynamic_cast¸¦ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. ¾Æ·¡´Â ¿¹Á¦ ÇÁ·Î±×·¥ÀÔ´Ï´Ù. ½É½ÉÇÏ½Ç ¶§ Çѹø¾¿ µ¹·Áº¸½Ã±æ.. :) ============================================================================ =========== {{{ #include class Root { public: virtual void rootx() = 0; }; class A : public Root { public: virtual void fn() = 0; }; class B : public Root { public: virtual void fx() = 0; }; class Foo : public A, public B { virtual void zz() { } void rootx() { } void fn() { } void fx() { } }; int main() { Foo *p = new Foo(); B *z = (B *)p; Root *q = static_cast(static_cast(p)); Root *r = dynamic_cast(dynamic_cast(p)); Root *x = (Root *)(((B *)(p))); printf("foo = %p\n", p); printf("(A *) = %p\n", (A *)p); printf("(b *) = %p\n", (B *)p); printf("static_cast(Foo *) = %p\n", static_cast(p)); printf("static_cast(Foo *) = %p\n", static_cast(p)); void *v = static_cast(p); printf("static_cast(void *) = %p\n", static_cast(v)); printf("static_cast(void *) = %p\n", static_cast(v)); printf("dynamic_cast(Foo *) = %p\n", dynamic_cast(p)); printf("dynamic_cast(Foo *) = %p\n", dynamic_cast(p)); printf("reinterpret(Foo *) = %p\n", reinterpret_cast(p)); printf("reinterpret(Foo *) = %p\n", reinterpret_cast(p)); printf("q = %p\n", q); printf("r = %p\n", r); printf("x = %p\n", x); //printf("(Foo *) = %p\n", (Foo *)q); //printf("static = %p\n", static_cast(q)); printf("dynamic_cast(Root *) = %p\n", dynamic_cast(q)); printf("reinterpret_cast(Root *) = %p\n", reinterpret_cast(q)); printf("dynamic_cast(B *) = %p\n", dynamic_cast(z)); } }}} ´Ù¸¥ ºÐ ÄÚ¸àÆ® static_cast´Â compile time¿¡ ÁÖ¾îÁø typeÀ» ÅëÇØ compile time¿¡ °áÁ¤ÇÒ ¼ö ÀÖ´Â castingÀ» ¼öÇàÇÒ °æ¿ì »ç¿ëÇÏ°í, ¹Ý¸é, dynamic_cast´Â compile time¿¡ ÁÖ¾îÁø typeÀÌ ¾Æ´Ï¶ó runtime¿¡ casting´çÇÏ´Â objectÀÇ ½ÇÁ¦ type Á¤º¸ (vtable ÀÌ°ÚÁÒ)¸¦ ÀÌ¿ëÇؼ­ castingÀ» ¼öÇàÇÑ´Ù°í ¸»Çؾ߰ڽÀ´Ï´Ù. µû¶ó¼­, up/downcast´Â ¹°·Ð siblingÀ¸·Îµµ casting °¡´ÉÇÕ´Ï´Ù. dynamic_cast´Â ÁÖ·Î polymorphismÀÇ ¿ëµµ·Î ¾²ÀÔ´Ï´Ù. reinterpret_cast´Â compilerÀÇ impl-dependentÇÑ castÀÌ°í µû¶ó¼­ non-portableÇϹǷÎ, °¡±ÞÀû ÀÚÁ¦ÇؾßÇÕ´Ï´Ù. ^^; const_castµµ ¿ø·¡ constant°¡ ¾Æ´Ñ storage¸¦ °¡Áö´Â data¸¦ const_cast·Î »ç¿ëÇؼ­´Â ¾ÈµË´Ï´Ù. dynamic_cast, reinterpret_cast, const_cast µîÀ» »ç¿ëÇϱâ Àü¿¡ cast¸¦ À¯¹ßÇÏ°Ô µÈ ¿øÀÎÀÌ ¹«¾ùÀÎÁö, design¿¡ ¹®Á¦°¡ ÀÖ´Â °ÍÀº ¾Æ´ÑÁö °ËÅäÇÏ´Â ½À°üÀÌ ÇÊ¿äÇÕ´Ï´Ù.