簡體   English   中英

如何將派生類與向量和共享指針一起使用?

[英]How shall I use derived classes with vectors and shared pointers?

我對繼承的概念不熟悉,並且正在努力尋找以下問題的解決方案。

我有2個課程,Head和Hand。 我將這些類的實例主要用作向量的元素。 這兩個類具有共同的方法,而只有它們才具有特殊的方法。

而且,我處理對象的共享指針。

我認為最好的實現方法是創建一個類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())。

有解決這個問題的適當方法嗎? 還是我的方法完全錯誤? 提前致謝!

您的方法是正確的,但編譯器也是如此。 擁有指向基類的共享指針向量是很好的,但是您需要強制轉換為實際類型以獲取特定功能。

typedef boost::shared_ptr<Hand> pointer; 雖然沒有用,但您只需要基類中的typedef 您不會在智能指針之間進行轉換。 我將基類typedef重命名為

typedef boost::shared_ptr<BodyPart> BodyPartPtr;

雖然。

艾倫(Alan)在評論中指出了一點:您應該使基類的析構函數虛擬化以防止UB,因為您將通過指向基類型的指針(間接)刪除指向派生類型的指針。

您的方法是正確的(盡管您實際上並不需要typedef ),您只需要使用boost::static_pointer_cast (在Doc這里 ),在需要時從shared_ptr<BodyPart>轉換為shared_ptr<Hand>

在您學習的某些時候,您還可以查看enable_shared_from_this

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM