C++如何将std :: vector <Derived*>类型的指针设置为std :: vector <Base*>类型的对象

chp*_*013 1 c++ polymorphism static-cast

的背景:

我正在用C++构建一个物理引擎,它计算笛卡尔空间中n体系统的引力演化,然后将其转换为任何一组预定义的坐标系.最终目标是使起始坐标系任意(在坐标系'n'中计算而不是仅用笛卡尔坐标),但这是一个遥远的目标.

问题:

因为坐标系应该可以互换,所以我使笛卡尔坐标系扩展了一个基本坐标系:

class CoordMember {
}

class CoordState {
   public:
      /* methods to operate on members */

   protected:
      std::vector<CoordMember*> members;
}

class Particle : public CoordMember {
}

class CartState : public CoordState {
}
Run Code Online (Sandbox Code Playgroud)

尝试创建指向类型std::vector<Particle*>的成员对象的类型指针时出现错误std::vector<CoordMember*>:

CartState* state = new CartState(/* initialization vars */);
std::vector<Particle*>* parts = static_cast< std::vector<Particle*>* >(&state->members);
Run Code Online (Sandbox Code Playgroud)

编译器错误是:

error: static_cast from 'std::vector<CoordMember *> *' to 'std::vector<Particle *> *' is not allowed
error: no viable overloaded '='
Run Code Online (Sandbox Code Playgroud)

我知道此时的事实是数据state->members都是类型的Particle*.我不知道要做什么才能使这个演员成为可能.有任何想法吗?

TL;博士:

std::vector<Derived*>* ptr = static_cast< std::vector<Base*>* >(&object);
static_cast from 'std::vector<Derived*>*' to 'std::vector<Base*>*' is not allowed
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 5

演员阵容不起作用,因为vectors 完全不相关.您必须在向量中转换每个单独的对象.

  • 因为,我认为,你将以多态方式使用它们,解决方案是首先维护一个`vector <Base*>`.一定要为类`Base`定义一个虚析构函数. (3认同)