2011-01-12 4 views
2

이 내가 이전에 물었다 문제에 대한 부분 2 : Is it possible to have polymorphic member overloading in C++?C++을 두 번 파견 문제

나는이 예제를 만든 위키 예를 사용.

내 문제는 컴파일 된 코드가 vtable을 조회하지 않으며 항상 상속 된 클래스 대신 기본 코드를 사용한다는 점입니다.

#include <iostream> 

class xEntity; 
class xVehicle; 

class xMapObject 
{ 
    public: 
    virtual void Bump(xMapObject&) { std::cout << "MapObject Bump MapObject\n"; }; 
    virtual void Bump(xEntity&) { std::cout << "MapObject Bump Entity\n"; }; 
    virtual void Bump(xVehicle&) { std::cout << "MapObject Bump Vehicle\n"; }; 
}; 

class xEntity : public xMapObject 
{ 
    public: 
    virtual void Bump(xMapObject&) { std::cout << "Entity Bump MapObject\n"; }; 
    virtual void Bump(xEntity&) { std::cout << "Entity Bump Entity\n"; }; 
    virtual void Bump(xVehicle&) { std::cout << "Entity Bump Vehicle\n"; }; 
}; 

class xVehicle : public xEntity 
{ 
    public: 
    virtual void Bump(xMapObject&) { std::cout << "Vehicle Bump MapObject\n"; }; 
    virtual void Bump(xEntity&) { std::cout << "Vehicle Bump Entity\n"; }; 
    virtual void Bump(xVehicle&) { std::cout << "Vehicle Bump Vehicle\n"; }; 
}; 

int main(int argv, char **argc) 
{ 
    xEntity Entity; 
    xVehicle Vechile; 

    xMapObject &EntityRef = Entity; 
    xMapObject &VehicleRef = Vechile; 

    VehicleRef.Bump(EntityRef); 

    return 0; 
} 

그러나, 출력은 항상 :이 비밀에 어떤 도움을 주시면 더 좋구요

Vehicle Bump MapObject 

여기 내 코드입니다.

답변

6

두 번 발송하지 않고 단일 발송 만 수행했습니다. 그 아이디어는 xVehicle에서 xMapObject&을 취하면 ref.bump(*this);이라고하며 이중 발송이라고합니다.

+0

이제는 많은 의미가 있습니다. 고맙습니다! –

+0

귀하의 질문에 답변이있는 경우, 동의로 표시해야합니다. – Puppy

+0

타이머가 만료 될 때까지 기다려야했습니다. –

1

vtable을 사용 중입니다. 그래서 전화가 xVechicle::Bump()입니다! vtable은 인수에 사용되지 않습니다. 이는 의미가 없습니다 (적어도 C++에서는).

일반적인 솔루션은 예를 들어, Bump(xMapObject& obj)obj.Bump(*this);으로 전화하십시오.

1

파생 클래스의 기본 클래스에서 매개 변수로 사용하고 있으므로 잘못된 디자인 인 xEntity :: Bump (xVehicle &)입니까?

적어도 계약 내용이 변경되면 Bump 메서드를 다시 정의 할 필요가 없습니다.

문제

는 기본 클래스에 파생 클래스를 변환하려면 xMapRef 바르를 만드는 것입니다.

적절한 메서드를 호출하려면 파생 클래스 개체를 호출하면됩니다.

+0

위키의 예를 따라 테스트 목적으로 만 사용되었습니다. 실제 버전에서 변경되었습니다. –