2

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

我有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 元素,并在需要时在向量元素上调用我的方法。

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

有没有合适的方法来处理这个问题?还是我的方法完全错误?提前致谢!

4

2 回答 2

3

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

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

typedef boost::shared_ptr<BodyPart> BodyPartPtr;

尽管。

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

于 2013-01-04T13:02:35.120 回答
2

您的方法是正确的(尽管您并不真正需要typedef),您只需要使用boost::static_pointer_castDoc hereshared_ptr<BodyPart> )在需要shared_ptr<Hand>时转换为 。

在您学习的某个阶段,您还可以查看enable_shared_from_this 。

于 2013-01-04T13:11:37.327 回答