gpt4 book ai didi

c++ - 将基类的对象转换为派生类

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:47 24 4
gpt4 key购买 nike

几天前我问了一些clarifications on inheritance ,一个我仍在努力理解的概念。这是后续问题,因为我仍然面临问题。

在我的项目中,我有两种类型的对象,手和脸,它们都继承自基类 BodyPart。 BodyPart 是这样的:

class BodyPart
{
public:
typedef boost::shared_ptr<BodyPart> BodyPartPtr;

BodyPart();
virtual ~BodyPart();

private:
int commonMember1;
double commonMember2;

public:
int commonMethod1();
int CommonMethod2();
}

而 Hand 是这样的:

class Hand : public BodyPart
{
public:
Hand();
~Hand();

private:
int numFingers;
double otherVar;

public:
int getNumFingers();
void printInfo();
}

我还有一个 BodyPart 元素 vector

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

由 Hand 或 Head 对象组成。在上一个问题中,我被告知这种方法是有道理的,我只需要使用 boost static_pointer_cast

从基类转换为派生类

现在的问题是,对于 vector 中的某些对象,我不知道它们是 Hand 还是 Head,所以在我的某个时刻我可以在 cBodyParts 中包含一些 Hand 元素、一些 Head 元素以及一些 BodyPart 元素。经过进一步分析后,我能够将后者正确分类为 HandHead 并相应地修改 vector 中的元素,但我不知道如何制作它.我应该只删除 case 类元素并创建一个具有相同属性的派生元素吗?在这种情况下我应该避免继承吗?

在此先感谢您的帮助

最佳答案

编辑:我扩充了示例以使其更清晰。

中继转换通常是糟糕设计的标志。 Actor 有他们的位置,但这看起来不是。

你需要问问自己,你想对存储在cBodyParts 中的对象做什么。当然,您将使用 HandHead 做不同的事情,但您可能可以以某种方式抽象它们:这就是虚函数的作用。因此,除了您已经为您的类编写的内容之外,您只需要在其中添加一个额外的虚函数:

class BodyPart
{
// Same as you wrote, plus:
public:
virtual void InitialisePart() = 0; // Pure virtual: each body part must say how to process itself
virtual void CalibrateJoints() {} // Override it only if the body part includes joints
}

class Head : public BodyPart
{
// Same as you wrote, plus:
public:
virtual void InitialisePart() {
// Code to initialise a Head
}
// Since a Head has no joints, we don't override the CalibrateJoints() method
}

class Hand : public BodyPart
{
// Same as you wrote, plus:
public:
virtual void InitialisePart() {
// Code to initialise a Hand
}
virtual void CalibrateJoints() {
// Code to calibrate the knuckles in the hand
}
}

然后你就不再需要任何转换了。例如:

for (BodyPart::BodyPartPtr part : cBodyParts) {
part->InitialisePart();
part->CalibrateJoints(); // This will do nothing for Heads
}

如您所见,根本没有转换,一切都会正常进行。该方案是可扩展的;如果您后来决定需要从 BodyPart 继承的其他类,只需编写它们,您的旧代码就会正常工作:

class Torso : public BodyPart
{
public:
virtual void InitialisePart() {
// Code to initialise a Torso
}
// The Torso has no joints, so no override here for CalibrateJoints()

// Add everything else the class needs
}

class Leg : public BodyPart
{
public:
virtual void InitialisePart() {
// Code to initialise a Leg
}
virtual void CalibrateJoints() {
// Code to calibrate the knee
}

// Add everything else the class needs
}

现在您无需更改之前编写的代码:上面的 for 循环将与 TorsoLeg 一起正常工作它发现不需要更新。

关于c++ - 将基类的对象转换为派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14232656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com