如何使用带向量和共享指针的派生类?

时间:2013-01-04 12:59:10

标签: c++ oop inheritance

我不熟悉继承的概念,我正在努力找到解决以下问题的方法。

我有2个班,头和手。我主要将这些类的实例用作向量的元素。这两个类有共同的方法和只有它们特有的方法。

此外,我处理对象的共享指针。

我认为实现它的最佳方法是创建一个类BodyPart,就像这样

class BodyPart
{
  public:
  typedef boost::shared_ptr<BodyPart> pointer;

  private:
  int commonMember1;
  double commonMember2;

  public:
  int commonMethod1();
  int CommonMethod2();
}

和这样的两个派生类

class Hand : public BodyPart
{
  public:
  typedef boost::shared_ptr<Hand> pointer;

  private:
  int numFingers;

  public:
  int getNumFingers();
  void printInfo();
}

最后,我想声明一个BodyPart元素的向量:

std::vector<BodyPart::pointer> cBodyParts;

包含Hand或Head元素,并在需要时在vector元素上调用我的方法。

但这种方法似乎并不是很有效。显然,当我尝试获取向量的元素时,编译器会抱怨它无法从BodyPart共享指针转换为Hand共享指针。此外,如果向上声明了向量,我就不能在其元素上调用特定于派生类(如getNumFinger())的方法,即使实际上是来自该类。

有没有正确的方法来解决这个问题?或者我的做法完全错了? 提前谢谢!

2 个答案:

答案 0 :(得分:3)

您的方法是正确的,但编译器也是如此。你有一个基类的共享指针向量,这是很好的,但是你需要转换为实际的类型以获得特定的功能。

typedef boost::shared_ptr<Hand> pointer;没用,你只需要基类中的typedef。你不会在智能指针之间进行投射。我将基类typedef重命名为

typedef boost::shared_ptr<BodyPart> BodyPartPtr;

虽然。

Alan在评论中提出了一个很好的观点:你应该使基类的析构函数虚拟化以防止UB,因为你将通过指向基类型的指针删除(间接)指向派生类型的指针。

答案 1 :(得分:2)

您的方法是正确的(虽然您并不真正需要typedef),但您只需使用boost::static_pointer_castDoc here)将shared_ptr<BodyPart>转换为{ {1}}当你需要时。

您可能还会在学习的某个时刻看一下enable_shared_from_this