±×µ¿¾È ¸ðÈ£Çß´ø(ÀúÈ¥ÀÚ ¸ðÈ£.. ¤Ì_¤Ì) 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)); } }}}