2012-09-16 1 views
0

conv.h클래스의 메서드가 어떻게 호출되는지 설명 할 수 있습니까?

class Base 
{ 
public: 
    void foo(); 
}; 

class Derived: public Base 
{ 
public: 
    void bar(); 
}; 

class A {}; 
class B 
{ 
public: 
    void koko(); 
}; 

conv.cpp

void Base::foo() 
{ 
    cout<<"stamm"; 
} 

void Derived::bar() 
{ 
    cout<<"bar shoudn't work"<<endl; 
} 
void B::koko() 
{ 
    cout<<"koko shoudn't work"<<endl; 
} 

MAIN.CPP

출력
#include "conv.h" 
#include <iostream> 
int main() 
{ 
    Base * a = new Base; 
    Derived * b = static_cast<Derived*>(a); 
    b->bar(); 

    Derived * c = reinterpret_cast<Derived*>(a); 
    c->bar(); 

    A* s1 = new A; 
    B* s2 = reinterpret_cast<B*>(s1); 
    s2->koko(); 
} 

:

bar shoudn't work 
bar shoudn't work 
koko shoudn't work 

어떻게 방법 줄 와서는 일에 성공한다 r에서 호출 그 시간에도 불구하고 파생되지 않은 Base 클래스를 만들었습니까 ?? 두 가지 유형의 변환 (정적 및 재 해석 캐스트)에서도 작동합니다.

위와 동일한 질문이지만 관련이없는 클래스 (A & B)와 동일한 질문이 있으십니까?

+0

변환이 작동하지 않는 한 안전하지 않은 변환을 실행하기 위해'static_cast' 또는'reinterpret_cast'를 사용하여 컴파일러 검사를 무시하는 것은 바람직하지 않습니다. – Recker

+2

거짓말하면 나쁜 일이 일어납니다. –

답변

1

공칭 "멤버"기능에서 this 포인터를 사용하지 않으므로 작동합니다 (읽기 : "컴파일 및 충돌하지 않음"). 예를 들어 멤버 변수를 출력하려고하면 가비지 출력이 나오거나 예상대로 작동하지 않을 것입니다.하지만이 함수는 현재 클래스의 일부에 의존하지 않습니다. this은 심지어 그들이 관심있는 모든 사람에게 NULL 일 수 있습니다.

+0

"나는 효과가있는 것 같습니다."라고 말하고 싶습니다. 실제로 작동하지 않습니다. 정의되지 않은 동작은 하나의 플랫폼에서 작동하고 다른 플랫폼에서 완전히 떨어지는 것처럼 보일 수 있습니다. OP는이 플랫폼에서 운 좋게되고 있습니다. –

+0

@ LokiAstari - 공정합니다. 나는 OP가 코드가 얼마나 나쁜지 알고있다. 나는이 질문을 "이 혼란을 봐라. C++ 신이 내려와 어떻게 시도해도 세 그 폴트를 치지 않는 이유는 무엇인가?"라고 읽었다. –

6

정의되지 않은 동작은 작동하는 것을 포함하여 무엇이든 할 수 있습니다.

+0

좋아, 정의되지 않은 동작이지만 뒤에 오는 것은 무엇인지 알 수 있습니까? – Nizarazo

+0

@ user1669812 : 중요한 비트를 놓친 것 같습니다. * "정의되지 않은 동작은 ** 무엇이든 할 수 있습니다. 루핑이 효과가있는 것처럼 보입니다. ** "*. 정의되지 않은 동작은 "충돌합니다"또는 이와 유사한 것을 의미하지 않습니다. 그것은 정의 된 행동입니다. 정의되지 않은 동작은 * 아무 것도 * 발생할 수 있음을 의미합니다. 더 명확하게하는 방법을 모르겠습니다. –

0

컴파일러는 Derived이 멤버 함수 foo()bar()을 사용할 수 있고 이들을 찾을 수 있음을 알고 있습니다. "트릭"을 한 후에는 Derived에 대한 포인터가있었습니다. 에 관계없이 데이터 그 포인터와 연관이 있었는지의 - -

그들이 유형 Derived의 포인터가 있었다 사실

그들이 파생와 관련된 기능 foo()kook()를 호출 할 수있었습니다.

앞서 언급했듯이 포인터에서 데이터를 실제로 사용한 경우 (예 :이 경우에는없는 파생 클래스에 속한 this) 데이터 회원을 읽거나 작성했습니다.

관련 문제