如何根据运行时类型而不是基类型对列表中的对象进行操作?

时间:2011-06-27 17:20:45

标签: c++

在我的程序中,我有一个基础Object类和一个向量。我有一个操作,我想对每个Object *执行,但操作依赖于Object *的派生类最多。因此,我使用访客模式。但是,我发现访客模式导致了大量的耦合;每当我添加一个新的Object派生类时,我必须更改基本访问者以及派生自Access的每个类。

是否有一种更简单的方法可以根据不会导致如此高耦合的运行时类型对对象列表执行操作?

4 个答案:

答案 0 :(得分:2)

class Object
{
  virtual void action() = 0;
  /* ... */
};

void objectAction(Object * o) { o->action(); }

int main()
{
  std::vector<Object*> v;
  std::for_each(v.begin(), v.end(), objectAction);
}

现在只需在每个派生类中实现action

答案 1 :(得分:1)

我会在两行之间进行阅读并猜测你的派生对象最多的成员函数对于它们是唯一的,并且不存在于任何其他派生对象中,这就是为什么你要#&# 39;我想将它们添加到基类。

您可以使用dynamic_cast查看指针是否属于派生程度最高的类,然后调用该函数。

MyBase * pBase = *iterator;
MyDerived * pDerived = dynamic_cast<MyDerived *>(pBase);
if (pDerived != NULL)
    pDerived->UniqueMethod();

答案 2 :(得分:0)

任何虚拟功能都会......

Object* obj;
//...
obj->doOperation();

答案 3 :(得分:0)

您的抽象基类(称为'对象')提供了每个继承类必须实现的抽象实现框架。您只需在基类的每个实例上调用正确的方法。这样的事情(在C#中,因为我的C ++相当腐蚀,但你应该明白这一点):

public abstract class Widget
{
  public void MandatoryMethod() ; // no method implementation
}

public class FooConcreteWidget : Widget
{
  public override void MandatoryMethod()
  {
    // some concreted implementation
  }
}
public class BarConcreteWidget : Widget
{
  public override void MandatoryMethod()
  {
    // another concrete implementation
  }
}

...
List<Widget> Widgets = GetSomeWidgets() ;

for ( Widget widget in Widgets )
{
   widget.MandatoryMethod() ;
}

这就是它的全部内容。