识别哪个基类shared_ptr已传递到超类shared_ptr向量

时间:2012-12-02 19:27:56

标签: c++ inheritance vector shared-ptr

我正在开发一个C ++项目,专门实现一个分流码算法。

我有一个函数可以创建一个超类型shared_ptr的向量,但是被推入这个向量的类都是基类shared_ptr

然后我需要使用这个向量并将其传递给另一个函数,并在for循环中为向量的每个元素执行不同的逻辑。但是,我执行的逻辑取决于向量的每个元素中存在哪个基类。

基本上我不知道的是如何识别向量的每个元素中的哪种类型的基类。当我调试时,它们都是超类型的。

所以我一般都喜欢做这样的事情:

if(vectorElement == baseClass)
{
  //do some logic
}

或者如果有一些不同的方法可以解决这个问题,我很想知道这一点。

2 个答案:

答案 0 :(得分:2)

您的问题有很多解决方案,坦率地说是OOP中几乎最常见的问题。

最明显的是虚拟函数在不同的类中执行不同的操作:

class SuperClass {
public:
   virtual void doSomething(/*someArgsIfNeeded*/) {
      // some base implementation, possible empty
      // or just use pure virtual function here
   }
};

class SubClass : public SuperClass {
public:
   virtual void doSomething(/*someArgsIfNeeded*/) {
      // some base implementation
   }
};

然后按如下方式使用:

int SomeArgs;
std::vector<std::shared_ptr<SuperClass>> objects;
for (auto it = objects.begin(); it != objects.end(); ++i)
  it->doSomething(/*someArgsIfNeeded*/);

其他更复杂的解决方案是使用visitor pattern


使用强制转换(dynamic_cast)被认为是一种不好的做法,所以总是要搜索比投射更多的OO解决方案,就像我上面提到的这两个。

答案 1 :(得分:0)

在我的脑海中,一个简单的解决方案是在基类中有一个函数,它返回一个表示它是哪个类的int。在每个派生类中,重写此函数以返回不同的值。您可以使用该值来确定向量中存储的类

编辑:通常,类特定的细节将保留在类中,这是多态的要点。尝试将派生类特定的计算作为每个类中的重写成员函数,并使用它只是为了获取在外面需要大型for循环(对于每个新派生类)的值。