일반적으로 void * 포인터에서 동적으로 캐스팅하는 방법은 무엇입니까?

비네 쉬구나 세카 란
class BASE {
public:
    virtual ~BASE() {}
    void lamp() {
        cout << "\nBASE CLASS";
    }
};

class DERIVED : public BASE {
public:
    void fun();
};

void DERIVED::fun() {
    cout << "\nDERIVED CLASS!";
}

int main() {

    BASE * pbase = new DERIVED; //BASE CLASS POINTER
    void * vbase = pbase;       //VOID POINTER TAKING BASE POINTER 
    DERIVED * pder;             //DERIVED CLASS POINTER

    //pder = static_cast<DERIVED *>(vbase);  //THIS WORKS
    pder = dynamic_cast<DERIVED *>(vbase);   //THIS DOESN'T
    pder->lamp();
    pder->fun();

    return 0;
}

void*파생 클래스 포인터에 대한 포인터 를 동적으로 캐스팅하려고 할 때마다 다음 오류가 발생합니다.

'vbase'( 'void *'유형)를 'class DERIVED *'유형으로 dynamic_cast 할 수 없습니다 (소스가 클래스에 대한 포인터가 아님).

StackOverflow를 검색하고 오류를 피하기 위해 기본 클래스에서 가상 함수를 구현하여 조언을 따랐습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 이것이 가능합니까?

내 전반적인 의도는 void*포인터를 사용하여 들어오는 모든 Object 유형을 Derived 클래스 유형으로 캐스팅하는 것 입니다. 무슨 말인지 이해해 주셨으면합니다.

예를 들면 :

void dynamicCast(void * vptr)
{
    BASE * pbase = new DERIVED;
    DERIVED * pder;

    pder = dynamic_cast<DERIVED *>(vbase);
}

모든 유형의 포인터를 dynamicCast함수 에 전달할 수 있어야 하며 파생 클래스 포인터로 변환되어야합니다.

Picaud Vincent

디자인이나 이해 문제가 있다고 생각합니다.

으로는 할 수 없습니다 설명 dynamic_castA로부터 void*.

왜? 때문에 dynamic_cast요구 사항이 일부 런타임 타입 정보 (RTTI)가 캐스팅을 수행합니다 ( 이 링크 자세한 내용을). 에서 void*혼자 C ++ 코드는이 정보가 어디 있는지 알 수있는 기회가 없습니다. 최소한 이러한 RTTI 정보가있는 개체에 대한 포인터를 사용하는 것입니다.

이 정보는 하나 이상의 가상 메서드를 가진 모든 클래스에 생성되고 바인딩됩니다 . 가상 방법이없는 경우이 정보는 포함되지 않습니다. 이것이 작동 하지 않는 이유입니다 .

struct A
{
};

struct B : A
{
};

int main()
{
  B  b;
  A *a = &b;

  dynamic_cast<B *>(a);  // YOUR COMPILE TIME ERROR
}

해결 방법은 A에 가상 메서드를 추가하는 것입니다. 여기 에서는 일반적으로 좋은 방법이므로 가상 소멸자를 추가했습니다.

struct A
{
   virtual ~A() = default;
};

struct B : A
{
};

int main()
{
  B  b;
  A *a = &b;

  dynamic_cast<B *>(a);  // OK
}

또한 dynamic_cast변환이 합법적인지 확인할 수 있습니다.

예를 들어 C 클래스를 추가 하고 다음을 확인할 수 있습니다 .

struct C 
{
};

int main()
{
  B  b;
  A *a = &b;

  assert(dynamic_cast<B *>(a)!=nullptr); // OK
  assert(dynamic_cast<C *>(a)==nullptr); // OK can not cast A to C 
}

이러한 종류의 런타임 작업은 무료가 아닙니다. 이 트릭을 사용할 수있는 최대 속도를 검색하는 경우 :

assert(dynamic_cast<B *>(a)!=nullptr);
B* b=static_cast<B*>(a);

디버그 모드에서 모든 것이 정상인지 확인하고 -DNDEBUG플래그를 제거하는 릴리스 모드 assert에서static_cast

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

일반적인 대괄호를 사용하여 Java에서 동적으로 캐스팅하는 방법은 무엇입니까?

분류에서Dev

다른 kext에서 클래스를 동적으로 캐스팅하는 방법은 무엇입니까?

분류에서Dev

"void (MyClass :: *) (int)"를 "void (*) (int)"로 캐스팅하는 방법은 무엇입니까?

분류에서Dev

문자 포인터 배열을 void *로 전달한 다음 문자 포인터 배열로 다시 캐스팅하는 방법은 무엇입니까?

분류에서Dev

문자 포인터 배열을 void *로 전달한 다음 문자 포인터 배열로 다시 캐스팅하는 방법은 무엇입니까?

분류에서Dev

C에서 void 포인터로 정수를 저장하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

객체 포인터를 반환하는 함수를 void 포인터를 반환하는 함수로 캐스팅하는 것이 합법적입니까?

분류에서Dev

컴파일 된 Angular 파일을 라우팅에 동적으로로드하는 방법은 무엇입니까?

분류에서Dev

일반 void 포인터를 사용하여 값을 배열로 스캔하는 방법은 무엇입니까?

분류에서Dev

포인터 값을 열거 형으로 캐스팅하는 방법은 무엇입니까?

분류에서Dev

다차원 배열을 기반으로 동적으로 인쇄 된 ol에 클래스를 동적으로 추가하는 방법은 무엇입니까?

분류에서Dev

조각에서 새 활동으로 커서를 캐스팅하는 방법은 무엇입니까?

분류에서Dev

동적으로 추가되는 div에 스타일을 적용하는 방법은 무엇입니까?

분류에서Dev

Perl에서 일반적인 방식으로 [^ <delim>]을 작성하는 방법은 무엇입니까?

분류에서Dev

스타일 구성 요소를 사용하여 동적 반응 데이터 (dangerouslySetInnerHTML)를 전역 적으로 스타일링하는 방법은 무엇입니까?

분류에서Dev

ctypes에서 상수로 캐스팅하는 방법은 무엇입니까?

분류에서Dev

C ++에서 char *를 byte *로 캐스팅하는 방법은 무엇입니까?

분류에서Dev

Java 클래스에서 함수 포인터를 효율적으로 만드는 방법은 무엇입니까?

분류에서Dev

boost :: scoped_ptr을 동적으로 캐스팅하는 방법은 무엇입니까?

분류에서Dev

C #에서 형식을 명시 적으로 확인하지 않고 자동으로 개체를 구체적인 형식으로 캐스팅하는 방법은 무엇입니까?

분류에서Dev

Java 프로그램에서 파일 경로를 동적으로 설정하는 방법은 무엇입니까?

분류에서Dev

KTable에서 동적으로 조회하는 방법은 무엇입니까?

분류에서Dev

DataGrid C # WPF에서 동적으로 행하는 방법은 무엇입니까?

분류에서Dev

C 표준을 준수하면서 일반적으로 포인터 주소를 캐스팅하는 방법

분류에서Dev

$ uri를 기반으로 nginx에서 동적 루트 경로를 사용하는 방법은 무엇입니까?

분류에서Dev

일반적인 방법으로 클릭 한 버튼을 확인하는 방법은 무엇입니까?

분류에서Dev

React Native에서 클릭으로 동적 스타일을 설정하는 방법은 무엇입니까?

분류에서Dev

TypeScript에서 배열 유형을 튜플 유형으로 암시 적으로 캐스팅하는 방법은 무엇입니까?

분류에서Dev

Java의 동일한 JPanel에있는 JComboBox 값을 기반으로 JTable을 동적으로 업데이트하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    일반적인 대괄호를 사용하여 Java에서 동적으로 캐스팅하는 방법은 무엇입니까?

  2. 2

    다른 kext에서 클래스를 동적으로 캐스팅하는 방법은 무엇입니까?

  3. 3

    "void (MyClass :: *) (int)"를 "void (*) (int)"로 캐스팅하는 방법은 무엇입니까?

  4. 4

    문자 포인터 배열을 void *로 전달한 다음 문자 포인터 배열로 다시 캐스팅하는 방법은 무엇입니까?

  5. 5

    문자 포인터 배열을 void *로 전달한 다음 문자 포인터 배열로 다시 캐스팅하는 방법은 무엇입니까?

  6. 6

    C에서 void 포인터로 정수를 저장하는 가장 좋은 방법은 무엇입니까?

  7. 7

    객체 포인터를 반환하는 함수를 void 포인터를 반환하는 함수로 캐스팅하는 것이 합법적입니까?

  8. 8

    컴파일 된 Angular 파일을 라우팅에 동적으로로드하는 방법은 무엇입니까?

  9. 9

    일반 void 포인터를 사용하여 값을 배열로 스캔하는 방법은 무엇입니까?

  10. 10

    포인터 값을 열거 형으로 캐스팅하는 방법은 무엇입니까?

  11. 11

    다차원 배열을 기반으로 동적으로 인쇄 된 ol에 클래스를 동적으로 추가하는 방법은 무엇입니까?

  12. 12

    조각에서 새 활동으로 커서를 캐스팅하는 방법은 무엇입니까?

  13. 13

    동적으로 추가되는 div에 스타일을 적용하는 방법은 무엇입니까?

  14. 14

    Perl에서 일반적인 방식으로 [^ <delim>]을 작성하는 방법은 무엇입니까?

  15. 15

    스타일 구성 요소를 사용하여 동적 반응 데이터 (dangerouslySetInnerHTML)를 전역 적으로 스타일링하는 방법은 무엇입니까?

  16. 16

    ctypes에서 상수로 캐스팅하는 방법은 무엇입니까?

  17. 17

    C ++에서 char *를 byte *로 캐스팅하는 방법은 무엇입니까?

  18. 18

    Java 클래스에서 함수 포인터를 효율적으로 만드는 방법은 무엇입니까?

  19. 19

    boost :: scoped_ptr을 동적으로 캐스팅하는 방법은 무엇입니까?

  20. 20

    C #에서 형식을 명시 적으로 확인하지 않고 자동으로 개체를 구체적인 형식으로 캐스팅하는 방법은 무엇입니까?

  21. 21

    Java 프로그램에서 파일 경로를 동적으로 설정하는 방법은 무엇입니까?

  22. 22

    KTable에서 동적으로 조회하는 방법은 무엇입니까?

  23. 23

    DataGrid C # WPF에서 동적으로 행하는 방법은 무엇입니까?

  24. 24

    C 표준을 준수하면서 일반적으로 포인터 주소를 캐스팅하는 방법

  25. 25

    $ uri를 기반으로 nginx에서 동적 루트 경로를 사용하는 방법은 무엇입니까?

  26. 26

    일반적인 방법으로 클릭 한 버튼을 확인하는 방법은 무엇입니까?

  27. 27

    React Native에서 클릭으로 동적 스타일을 설정하는 방법은 무엇입니까?

  28. 28

    TypeScript에서 배열 유형을 튜플 유형으로 암시 적으로 캐스팅하는 방법은 무엇입니까?

  29. 29

    Java의 동일한 JPanel에있는 JComboBox 값을 기반으로 JTable을 동적으로 업데이트하는 방법은 무엇입니까?

뜨겁다태그

보관