다음 코드가 있다고 말하면 안전할까요?파생 클래스에 캐스팅 된 기본 클래스의 함수를 호출하십시오.
기본 클래스 :
class B
{
public:
B(bool isDerived = false) : m_isDerived(isDerived) {}
bool isDerived() { return m_isDerived; }
private:
bool m_isDerived;
}
파생 클래스 :
class D : public B
{
public:
D() : B(true) {}
}
코드 :
B* b = new B(); // Create new base class
D* unknown = static_cast<D*>(b); // Cast the base class into a derived class
if (unknown->isDerived()) // Is this allowed?
// unknown is a D and can be used as such
else
// unknown is not a D and can not be used
내가 안전하게 호출 할 수 있습니다 unknown-> isDerived()도 알 수없는 생각되어 정말 B 이 경우에는?
우리는 알 수없는 NEVER에 B * 또는 D *가 포함되어 있지 않으며 isDerived()가 확인 될 때까지 알 수없는 것으로 처리하지 않는다고 가정합니다.
편집 :
내가이 작업을 수행하기 위해 노력하고있어 이유를 설명하려고합니다 질문을 감안할 때 : 그래서 기본적으로 나는 물론 직접 연결되지 않을 수있는 Windows 트리 제어 할 수 있습니다 C++ 트리 구조에 데이터를 저장하는 데 사용하고 있습니다. 그래서 나는 트리 컨트롤의 각 노드와 함께 저장되어있는 DWORD_PTR에 내 데이터를 reinterpret_cast해야만이 둘 사이의 연결이 생깁니다. 내 트리 구조는 기본 유형 (일반 노드) 또는 파생 유형 (다르게 처리되어야하는 더 많은 정보가있는 노드)으로 구성됩니다. 이것들에 대한 포인터는 reinterpret_cast : 트리 컨트롤에 넣고 넣는다.
트리 컨트롤을 통해 진행할 때, 파생 된 유형의 노드에 대해 조치를 취해야하므로 파생 된 유형으로 DWORD_PTR을 reinterpret_cast하고 싶습니다. 하지만 전적으로 올바른하려면 reinterpret_cast 기본 형식 (먼저 같아요?), 파생 된 형식이면 파생 된 형식으로 다운 캐스트합니다. 그러나 나는 그것을 파생 형식으로 즉시 reinterpret_cast하여 조금 더 간단하게 만들 수 있다고 생각하고 실제로 파생 형식 인 경우 함수를 통해 확인합니다. 그렇지 않다면 나는 더 이상 아무것도하지 않습니다. 내 마음에 포인터의 기본 클래스 데이터를 얼마나 많은 파생 된 상관없이 같은 메모리 위치에 있어야하지만 내가 왜 여기에 물어 잘못 될 수도 있습니다.
나는 거기에 윈도우를 포함하지 않음으로써 질문을 명확하게하고 싶어하지만, 현실에서 내가 원하는이 가까운 것이 없을 것입니다 : 기본적으로 상관없이 나는 그것이 일부에서 여전히 안전하지 않은 일을
B* b1 = new B();
B* b2 = new D();
DWORD_PTR ptr1 = reinterpret_cast<DWORD_PTR>(b1);
DWORD_PTR ptr2 = reinterpret_cast<DWORD_PTR>(b2);
D* unknown = reinterpret_cast<D*>(ptr1 /* or ptr2 */); // Safe?
unknown->isDerived(); // Safe?
데이터를 reinterpret_cast해야합니다.
는 관련이없는 유형을 캐스팅'reinterpret_cast'를 사용하지할까요? – cppcoder
@cppcoder 그건 강제 다운 캐스트이고 가능성이 미정의 동작을 방아쇠를 당길 것입니다 –
컴파일을 시도하고 그것이 무엇을 참조하십시오? –