首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:继承问题

C++:继承问题
EN

Stack Overflow用户
提问于 2010-04-16 12:06:12
回答 5查看 217关注 0票数 3

很难解释我要做什么,我将尝试:假设一个基本class A包含一些变量,以及一组派生自A的类,这些类都实现了对从A继承的变量进行操作的方法bool test()

代码语言:javascript
复制
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的值。

代码语言:javascript
复制
int main(int, char* []) {
    A a;
    a.somevar = 42;

现在,我需要某种容器,允许我迭代这个容器的元素i,在a的上下文中调用i::test() .即:

代码语言:javascript
复制
    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的

  1. ,它使用指针来调用另一个类型的对象上的类型的方法(有效,但似乎很糟糕);使用std::bind +解决方案的
  2. ,丑陋的bool test()签名,以便它采用const A&类型的参数,而不是从A继承,我不喜欢这个解决方案,因为somevar必须是公共的。

编辑:

解决办法(1)是:

代码语言:javascript
复制
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))();
}

我不确定静态石膏是否安全。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-04-16 13:07:53

这是迄今为止最干净的解决方案。它使用static

代码语言:javascript
复制
struct A {
   int somevar;
};

struct B {
   static bool test(const A& a) {
      return (a.somevar == 42);
   }
};

std::vector<bool (*)(const A&)> vec;

template<typename T>
void push(const T&) {
   vec.push_back(&T::test);
}
票数 0
EN

Stack Overflow用户

发布于 2010-04-16 12:16:28

最干净的解决方案是您建议的最后一个解决方案,使test成为A中的一个(纯)虚拟函数。

代码语言:javascript
复制
virtual bool test(const A& value) = 0;

如果您很费心地让somevar公开,保持它的私有性,并且只提供一个公共get函数:

代码语言:javascript
复制
int getvar() const {return somevar;}
票数 5
EN

Stack Overflow用户

发布于 2010-04-16 12:14:00

您正在尝试在B上调用AC方法。别干那事。

您需要创建BC的实际实例,将指向它们的指针存储在vector<A*>中,并在迭代期间调用在A中定义的纯虚拟test()成员函数( B::testC::test将覆盖该函数)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2652738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档