답변:
dynamic_cast가 트릭을 수행해야합니다
TYPE& dynamic_cast<TYPE&> (object);
TYPE* dynamic_cast<TYPE*> (object);
dynamic_cast키워드는 캐스트의 유효성을 보장하기 위해 런타임 검사를 수행, 다른 하나 개의 포인터 또는 참조 유형에서 데이텀을 캐스팅합니다.
실제 객체 유형이 아닌 유형에 대한 포인터를 캐스트하려고하면 캐스트 결과는 NULL입니다. 실제 객체 유형이 아닌 유형을 참조하기 위해 캐스트하려고하면 캐스트에서 bad_cast예외 가 발생합니다.
dynamic_cast가 작동하도록 Base 클래스에 하나 이상의 가상 함수가 있는지 확인하십시오.
위키 백과 주제 런타임 유형 정보
RTTI는 다형성 클래스에만 사용할 수 있습니다. 즉, 하나 이상의 가상 메소드가 있습니다. 실제로, 기본 클래스에는 파생 클래스의 객체가 기본 포인터에서 삭제 된 경우 적절한 정리를 수행 할 수 있도록 가상 소멸자가 있어야하므로 제한이 없습니다.
dynamic_cast컨버터블하지 않을 경우 던져? 던지는 일없이 할 수있는 방법이 있습니까?
A* aptr = dynamic_cast<A*>(ptr);// 이런 식으로되어 있지
uint8_t*? 즉, 나는 그것을 확인할 수 있습니다 uint32_t* x = dynamic_cast<uint32_t*>(p), 어디 p있다 uint8_t*? (정상 위반에 대한 테스트를 찾으려고합니다).
동적 캐스트는 문제 설명에 가장 적합하지만 다음과 같이 클래스 유형을 찾을 수 있다고 덧붙이고 싶습니다.
#include <typeinfo>
...
string s = typeid(YourClass).name()
11MyClass. 엉키지 않게하려면에서 ABI 확장 라이브러리를 사용할 수 있습니다 cxxabi.h. 이것은 당신 abi::__cxa_demangle에게 실제 이름을 줄 것입니다
완료하기 위해 Robocide에서 빌드를 빌드하고 typeidname ()을 사용하지 않고 단독으로 사용할 수 있음을 지적합니다 .
#include <typeinfo>
#include <iostream>
using namespace std;
class A {
public:
virtual ~A() = default; // We're not polymorphic unless we
// have a virtual function.
};
class B : public A { } ;
class C : public A { } ;
int
main(int argc, char* argv[])
{
B b;
A& a = b;
cout << "a is B: " << boolalpha << (typeid(a) == typeid(B)) << endl;
cout << "a is C: " << boolalpha << (typeid(a) == typeid(C)) << endl;
cout << "b is B: " << boolalpha << (typeid(b) == typeid(B)) << endl;
cout << "b is A: " << boolalpha << (typeid(b) == typeid(A)) << endl;
cout << "b is C: " << boolalpha << (typeid(b) == typeid(C)) << endl;
}
산출:
a is B: true
a is C: false
b is B: true
b is A: false
b is C: false
설명이 약간 혼란 스럽다.
일반적으로 일부 C ++ 구현에는 메커니즘이 있지만 유형에 대해 묻지 않아도됩니다. 대신 A에 대한 포인터에서 dynamic_cast를 수행해야합니다.이 작업은 런타임에 A에 대한 포인터의 실제 내용을 확인하는 것입니다. B가있는 경우 B에 대한 포인터를 얻습니다. 그렇지 않으면 예외가 발생하거나 null이 발생합니다.
과부하 된 기능을 사용하십시오. dynamic_cast 또는 RTTI 지원이 필요하지 않습니다.
class A {};
class B : public A {};
class Foo {
public:
void Bar(A& a) {
// do something
}
void Bar(B& b) {
Bar(static_cast<A&>(b));
// do B specific stuff
}
};
부스트 라이브러리에 액세스 할 수 있다면 type_id_with_cvr () 함수가 필요할 것입니다 .const , volatile, & 및 && 수정자를 제거하지 않고도 데이터 유형을 제공 할 수 있습니다 . 다음은 C ++ 11의 간단한 예입니다.
#include <iostream>
#include <boost/type_index.hpp>
int a;
int& ff()
{
return a;
}
int main() {
ff() = 10;
using boost::typeindex::type_id_with_cvr;
std::cout << type_id_with_cvr<int&>().pretty_name() << std::endl;
std::cout << type_id_with_cvr<decltype(ff())>().pretty_name() << std::endl;
std::cout << typeid(ff()).name() << std::endl;
}
이것이 유용하기를 바랍니다.