2011-01-12 69 views
2

這是第2部分,以我以前問一個問題:Is it possible to have polymorphic member overloading in C++?C++雙重分派問題

使用我創造了這個例子中,維基例子。 http://en.wikipedia.org/wiki/Double_dispatch

我的問題是,編譯的代碼永遠不會查找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

它使一個很大的意義,現在打電話。謝謝! – 2011-01-12 16:58:33

+0

如果這回答了您的問題,您應該將其標記爲已接受。 – Puppy 2011-01-12 17:01:52

1

它使用的是vtable;這就是爲什麼它叫xVechicle::Bump()! vtable不用於參數,這是沒有意義的(至少在C++中)。

典型的解決方案是讓例如Bump(xMapObject& obj)致電obj.Bump(*this);

1

是一個糟糕的設計xEntity :: Bump(xVehicle &),因爲您在基類中使用派生類作爲參數。

並且至少你的合同變了,你不需要重新定義基地凹凸方法。

的問題是,你正在創建的xMapRef瓦爾,你派生類轉換爲基類。

如果你想要的撥款方法被調用,只需用派生類對象