在处理父类对象列表时调用Child类的方法

时间:2009-12-04 15:24:16

标签: c++ oop

这个问题似乎有些常见,但是在为StackOverflow或者互联网进行分析时我没有找到任何东西。

我遇到了C ++类中的一个方法,它接受(例如)Parent个对象的列表。对于此示例,假设有两个类派生自ParentChild1Child2

对于列表中的每个对象,该方法检查对象是否为Child2类型(通过每个类实现的IsOfType()方法),如果是,则调用仅为由Child2类提供。

这是一个问题,因为列表处理方法不能对每个对象进行相同处理吗?我已经在其他地方看到过这种情况,所以在某种程度上这似乎是一种常见的做法。

一个选项可能是在Child2类中声明Parent方法,以便所有Parent个对象实现它。但是,在这种情况下,只有Child2类实际上会在覆盖方法时实现任何行为。

你的想法?提前谢谢!

4 个答案:

答案 0 :(得分:3)

我认为以下是解决此问题的更好方法。

class Parent {
public:
   virtual int doSomething() {}
};

class Child1 : public Parent {
};

class Child2 : public Parent {
public:
    virtual int doSomething();

现在你只需完全省略IsOfType调用,并在传递给你的所有指针上调用doSomething。

我能想到为什么你有一个IsOfType函数的唯一理由是,如果你没有对Parent类的控制,并且不能修改它来添加doSomething方法。 / p>

答案 1 :(得分:2)

您可以在仅Child2实现的接口中声明新方法。然后,您可以使用dynamic_cast<ISomeOtherInterface>查看对象是否支持扩展功能。此强制转换将为不支持其他接口的对象生成null指针。

这将允许您创建实现此功能的其他对象,而无需您的列表处理了解每种特定对象类型。

答案 2 :(得分:1)

如果您的IsOfType()测试通过,您可以将(指向)父对象的指针强制转换为Child2对象并访问其特定的成员函数。

编辑: 这取决于您的设计以及您确保IsOfType()实现将给出正确答案的严格程度(即,当您在一周内添加新的子类时它也有效)。使用内置Typeid可能更安全。 实现任何一个孩子在父母身上所拥有的每种可能的方法都很困难,因此当该方法在语义上特定于Child2类时,上传是可以的。

答案 3 :(得分:0)

您可能会发现Visitor Pattern在此实例中很有用。这将允许对象本身(child1child2等)使用其静态类型回叫您并采取适当的操作。