我不熟悉继承的概念,我正在努力找到解决以下问题的方法。
我有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())的方法,即使实际上是来自该类。
有没有正确的方法来解决这个问题?或者我的做法完全错了? 提前谢谢!
答案 0 :(得分:3)
您的方法是正确的,但编译器也是如此。你有一个基类的共享指针向量,这是很好的,但是你需要转换为实际的类型以获得特定的功能。
typedef boost::shared_ptr<Hand> pointer;
没用,你只需要基类中的typedef
。你不会在智能指针之间进行投射。我将基类typedef重命名为
typedef boost::shared_ptr<BodyPart> BodyPartPtr;
虽然。
Alan在评论中提出了一个很好的观点:你应该使基类的析构函数虚拟化以防止UB,因为你将通过指向基类型的指针删除(间接)指向派生类型的指针。
答案 1 :(得分:2)
您的方法是正确的(虽然您并不真正需要typedef
),但您只需使用boost::static_pointer_cast
(Doc here)将shared_ptr<BodyPart>
转换为{ {1}}当你需要时。
您可能还会在学习的某个时刻看一下enable_shared_from_this。