c++ - 我该如何使用带有 vector 和共享指针的派生类?

标签 c++ oop inheritance

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

我有 2 个类别,头部和手部。我主要使用这些类的实例作为 vector 的元素。这两个类有共同的方法和特有的方法。

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

我认为实现它的最佳方法是创建一个 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 元素的 vector :

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

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

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

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

最佳答案

你的方法是正确的,但编译器也是正确的。拥有指向基类的共享指针 vector 是件好事,但您需要转换为实际类型才能获得特定功能。

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

typedef boost::shared_ptr<BodyPart> BodyPartPtr;
不过。

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

关于c++ - 我该如何使用带有 vector 和共享指针的派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14157661/

相关文章:

c# - 检查实例是否继承自 C# 中类的泛型或非泛型版本

c# - 在 Inherited Class Constructor C# 中强制部分基初始化(和方法)(就像抽象对方法所做的那样)——解决这个问题

javascript - 将回调作为参数发送给 QJSValue::callAsConstructor()

c++ - c++:使用数组,指针和循环来制作直方图。我就在那儿,我可能想得太辛苦了

c++ - 对 std::string 数组进行二进制搜索

php - 从静态函数获取子类名 php

PHP session : SESSION Variables Automatically Reset after Unserialize()

c++ - 如何使用模板设置 union 字段

oop - 在 Fortran 中扩展对象并覆盖过程而不延迟

javascript - 这2种继承方式有区别吗?