我不熟悉继承的概念,并且正在努力寻找以下问题的解决方案。
我有 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/