這是相當難以解釋什麼,我試圖做的,我會嘗試:想象一下,一個基地class A
其中包含了一些變量,以及一組從A
派生類,所有實現一些方法bool test()
經營關於從A
繼承的變量。C++:繼承問題
class A {
protected:
int somevar;
// ...
};
class B : public A {
public:
bool test() {
return (somevar == 42);
}
};
class C : public A {
public:
bool test() {
return (somevar > 23);
}
};
// ... more classes deriving from A
現在我有class A
一個實例,我已經設置了一個somevar
值。
int main(int, char* []) {
A a;
a.somevar = 42;
現在,我需要某種容器,讓我來遍歷這個容器中的元素i
,在a
情況下調用i::test()
...那就是:
std::vector<...> vec;
// push B and C into vec, this is pseudo-code
vec.push_back(&B);
vec.push_back(&C);
bool ret = true;
for(i = vec.begin(); i != vec.end(); ++i) {
// call B::test(), C::test(), setting *this to a
ret &= (a .* (&(*i)::test))();
}
return ret;
}
哪有我這樣做?我已經試過兩種方法:
- 迫使從B :: *強制轉換爲A :: *,適應指針調用類型的方法的不同類型(的作品的對象,但似乎壞);
- 使用std :: bind +上面的解決方案,醜陋的破解;
- 更改
bool test()
的簽名,以便它採用const A&
類型的參數而不是繼承自A,我不太喜歡這個解決方案,因爲somevar必須是公共的。
編輯:
解決方案(1):
typedef bool (A::*)() mptr;
std::vector<mptr> vec;
vec.push_back(static_cast<mptr>(&T::test));
std::vector<mptr>::iterator i;
for(i = vec.begin(); i != vec.end(); ++i) {
(a .* (*i))();
}
我不知道靜態澆鑄是安全的。
覆蓋的子虛擬方法中操作父狀態粗劣:有什麼問題,你實際上* *嘗試在這裏解決?關於你的關於使somevar公開的評論的附註,它已經被保護了,它只是一個稍微受限制的公共形式,因爲它已經將你的班級的內部狀態暴露給任意修改。 – 2010-04-16 14:36:05
通常當你遇到這樣的問題時,你可能會以錯誤的方式回答這個問題。這並不能幫助你找出正確的方法,但至少你有線索開始尋找它。 – Jay 2010-04-16 15:46:37