2010-08-12 113 views
1

繼承的方法,我有這樣的事情不同類型

class A { 
    virtual void doBla(A *a) = 0; 
}; 

class B : public A { 
    virtual void doBla(B *b) { // do stuff ;}; 
}; 

,我想這樣做

​​3210

或:A的所有兒童都應該有一個方法doBla,這需要孩子類型的參數。希望你收到我的問題,希望有人能幫助我,或說服我,這是不好的風格:)

編輯:添加虛擬的方法

+0

你需要使A doBla虛擬化。 – 2010-08-12 10:45:47

+0

@尼爾:我不認爲這會對這種情況有所幫助。我認爲OP需要的是協變參數類型,這在C++中顯然目前不受支持(參見http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29#C.2B.2B)。 – David 2010-08-12 10:46:56

+0

@尼爾:對不起,忘了那個...... thx – Dirk 2010-08-12 10:47:57

回答

1

你不能重載整個基地/子類的功能,並doBla成員函數

class A { 
    public: 
    virtual void doBla(A *a) = 0; 
}; 

class B : public A { 
    virtual void doBla(A *a) { /*do stuff*/ } 
}; 

編輯:請注意,doBla函數的聲明是在A和B類相似,如果你想從外面把它A類的必須是public。

+0

是不是會自動公開? – Dirk 2010-08-12 11:05:28

+0

@Dirk:類的成員函數是private(默認),struct的成員函數是public(默認)。 – 2010-08-12 11:11:06

1

這是不可能的,因爲它沒有doBla(B * b)函數,所以當你試圖在實例上調用它時,編譯器無法保證該函數實際存在,它不知道如何查看它。這是一個錯誤或十。

您可能正在尋找的是雙派遣。

class A { 
public: 
    virtual void doBla(A* a) { a->doBla_impl(this); } 
private: 
    virtual void doBla_impl(A* a); 
    virtual void doBla_impl(B* b); 
    // etc 
}; 

class B : public A { 
public: 
    virtual void doBla(A* a) { a->doBla_impl(this); } 
private: 
    virtual void doBla_impl(A* a); 
    virtual void doBla_impl(B* b); 
    // etc 
}; 

這樣做的問題是你必須知道所有的基類,這並不總是可行或不可行的派生類型。