[英]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.