2014-09-10 1 views
-3

이 부분은 혼란 스럽습니다. dynamic_cast를 사용하여 포인터 사이의 변환 결과가 대상 유형의 유효한 전체 개체인지 확인하는 동안 유효한 완전한 개체 인 이 의미하는 바를 얻을 수 없습니다.유효한 완전한 개체 의미는 무엇입니까?

#include <iostream> 
#include <exception> 
using namespace std; 

class Base { virtual void dummy() {} 


}; 
class Derived: public Base {public: 
void print(){cout << "NiGHt!\n"; 
int a; }; 

int main() { 
try { 
Base * pba = new Derived; 
Base * pbb = new Base; 
Derived * pd; 

pd = dynamic_cast<Derived*>(pba); 
if (pd==0) cout << "Null pointer on first type-cast.\n"; 

pd = dynamic_cast<Derived*>(pbb); 
if (pd==0) cout << "Null pointer on second type-cast.\n"; 

} catch (exception& e) {cout << "Exception: " << e.what();} 

return 0; 
} 

이 두 줄이 변환 결과가 성공했다는 것을 나타내는 경우 포인터 pba를 사용하여 파생 클래스에 들어갈 수없는 이유는 무엇입니까? Derived 개체에 대한 포인터를 가리키는에 :

pd = dynamic_cast<Derived*>(pba); 
if (pd==0) cout << "Null pointer on first type-cast.\n"; 
+0

두 번째 캐스트는 실제 코드에서 성공하지 못합니다. – juanchopanza

+0

[dynamic_cast] (http://www.cplusplus.com/doc/tutorial/typecasting) 비공식적으로 전체 유형의 객체를 말할 수 있으며 완전히 정의 된 클래스에 속한 객체 인스턴스입니다. 클래스는 [this] (http://pastebin.com/nEA9wiDp)와 같이 불완전한 유형의 객체를 멤버로 사용할 수 있습니다. – iamOgunyinka

+0

들여 쓰기 수정 – zoska

답변

0

pba 포인터를 캐스팅 pd = dynamic_cast<Derived*>(pba); 수단 라인 (Base * pba = new DerivedBase 클래스에 대한 포인터이다, 그러나 그것은 Derived 객체 때문에 포함)을. 이 캐스트는 BaseDerived 사이에 관계가없는 경우 실패합니다 (예 : DerivedBase에서 파생되어야합니다)이 0으로

를 반환합니다 그리고 당신은 pba을 사용할 수없는 이유 Derived 클래스를 얻으려면? Beclase pbaBase 클래스에 대한 포인터입니다. 따라서 심지어 Derived 클래스가 있다는 것을 모릅니다.

참조 : When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

관련 문제