2013-10-10 115 views
0

我有一個基類呼叫派生類的方法

class base { 
    public: 
    base(); 
    int someData; 
    virtual void foo(){ 
     std::cout << someData; 
    } 
}; 

和幾個派生類,如

class derived : public base { 
    public: 
    derived(); 
    void foo(){ 
    std::cout << someData * 5; 
    } 
}; 

基本上他們有同樣的數據,但在作業本數據是不同的。 我有另一個不需要知道我的對象的細節的類,它所需要做的就是設置數據並調用派生的foo()。

class useData { 
    public: 
    useData(); 

    base x; 
    int do() { x.someData = 5; return x.foo(); } 
}; 

我想「useData」,以儘可能通用的,所以我使用的基類,而不是在其定義的派生類。 當然在這種情況下,它會調用基本方法而不是派生的方法。我如何重寫我的代碼或自動(無需類型檢查或類似)調用派生方法?

謝謝

+0

存儲引用或指向'base'的指針。 'base x;'將永遠只是一個'base',而不是'derived'。 – jrok

+0

請看我對Hivert的回答。 必須有我忘記的東西,因爲我知道這是多態性是如何工作的,但現在我看不出我做錯了什麼。 – Codeluppi

+1

然後顯示你的真實代碼。 – jrok

回答

1

要使用多態,你需要一些指針或引用。所以在useData變量x應宣佈爲base *。之後,你可以創建一個帶有任何派生類的new。多態性將按預期執行。

+0

我知道我必須使用一個指針(對不起,我寫的代碼是一個非常基本的存根),但也許我錯過了別的東西。 如果我做「新的派生()」,這意味着我知道什麼樣的派生類使用,所以我的useData類不是通用的,需要知道每種派生類。這正是我想要避免的。 – Codeluppi

+2

您似乎誤解了多態性。您通常需要知道您正在實例化的對象類型(有例外)。一旦你有了一個指向實例化對象的指針,如果你想執行基本操作,那麼它的派生類是什麼並不重要。 –

+0

@Codeluppi所以我們假設你也從'base'派生了'derived2'。那麼編譯器現在應該如何使用哪個'foo()'實現? – Ali