这是相当难以解释什么,我试图做的,我会尝试:想象一下,一个基地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