2013-12-16 8 views
1

나는 절망에 빠져있다!비 - 가상 멤버 함수를베이스에서 호출

class A { }; 

class B : public A { public: void evilFunction() { std::cout << "Yay!"; } }; 

int main(void) { 
    A *pointer = new B(); 

    // Now do something like this: 
    // pointer->evilFunction(); 

    return 0; 
} 

은 내가 dynamic_cast는 함께 할 수있어 -하지만 난에 허용되지 않아 : 내 기본 클래스에 대한 포인터에서 가상이 아닌 멤버 함수를 호출 할 필요가! 나는 내가 할 수있는 일을 정말로 모른다. 이론적으로, 포인터를 가지고 있기 때문에 포인터 연산을 사용하여 함수의 메모리 위치를 얻은 다음 호출 할 수있는 마법을 사용할 수 있다고 확신하지만이 작업을 수행하는 방법이나 적어도 어떻게 수행해야할지 모르겠다. 스타트.

나에게 힌트를 줄 수있는 사람은 누구입니까? 그게 내가 원하는 전부 야. 아니면 서사시 초보자 스킬을 사용하여 g ++을 삭제하는 코드를 작성하여 C++의 고통에 대한 보복으로 사용할 것입니다! 그 일을 그냥 내버려 둘 수는 없잖아요.

+0

가상 기능을 사용하는 교과서 사용 사례입니다. –

+4

사실,'dynamic_cast'로 이것을 할 수 없습니다. –

+0

왜 당신은 .. ~해야합니까? – Sean

답변

7

포인터가 실제로 B을 가리키는 것을 알게되면 static_cast을 사용하십시오.


int main() 
{ 
    A *pointer = new B(); 

    // Now do something like this: 
    // pointer->evilFunction(); 
    static_cast<B*>(pointer)->evilFunction(); 
} 
+0

정말 고마워요,이게 다라고 생각합니다! – chris342423

0

여기에 주요 질문은, 왜 dynamic_cast는 사용이 허용되지 않습니다.

RTTI를 사용하지 않아서 static_cast를 사용할 수 있습니다. 이것이 사용자의 대답 일 수 있습니다.

그러나 이것이 코드 표준 또는 유사성 때문이라면 static_cast 또는 "마법"도 금지되어 있다고 생각하므로 다른 해결책을 생각해야합니다 (예 : 메서드 가상, 기본 클래스에 "manual typeid"를 추가하고 이에 따라 디스패치 (0120 ...),

0

가상 함수를 사용하지 않으려는 이유가 RTTI를 피하는 것이면 정적 다형성은 CRTP idiom을 사용합니다.