繼承的方法,我有這樣的事情不同類型
class A {
virtual void doBla(A *a) = 0;
};
class B : public A {
virtual void doBla(B *b) { // do stuff ;};
};
,我想這樣做
3210或:A的所有兒童都應該有一個方法doBla,這需要孩子類型的參數。希望你收到我的問題,希望有人能幫助我,或說服我,這是不好的風格:)
編輯:添加虛擬的方法
繼承的方法,我有這樣的事情不同類型
class A {
virtual void doBla(A *a) = 0;
};
class B : public A {
virtual void doBla(B *b) { // do stuff ;};
};
,我想這樣做
3210或:A的所有兒童都應該有一個方法doBla,這需要孩子類型的參數。希望你收到我的問題,希望有人能幫助我,或說服我,這是不好的風格:)
編輯:添加虛擬的方法
你不能重載整個基地/子類的功能,並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。
是不是會自動公開? – Dirk 2010-08-12 11:05:28
@Dirk:類的成員函數是private(默認),struct的成員函數是public(默認)。 – 2010-08-12 11:11:06
這是不可能的,因爲它沒有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
};
這樣做的問題是你必須知道所有的基類,這並不總是可行或不可行的派生類型。
你需要使A doBla虛擬化。 – 2010-08-12 10:45:47
@尼爾:我不認爲這會對這種情況有所幫助。我認爲OP需要的是協變參數類型,這在C++中顯然目前不受支持(參見http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29#C.2B.2B)。 – David 2010-08-12 10:46:56
@尼爾:對不起,忘了那個...... thx – Dirk 2010-08-12 10:47:57