这个问题似乎有些常见,但是在为StackOverflow或者互联网进行分析时我没有找到任何东西。
我遇到了C ++类中的一个方法,它接受(例如)Parent
个对象的列表。对于此示例,假设有两个类派生自Parent
:Child1
和Child2
。
对于列表中的每个对象,该方法检查对象是否为Child2
类型(通过每个类实现的IsOfType()
方法),如果是,则调用仅为由Child2
类提供。
这是一个问题,因为列表处理方法不能对每个对象进行相同处理吗?我已经在其他地方看到过这种情况,所以在某种程度上这似乎是一种常见的做法。
一个选项可能是在Child2
类中声明Parent
方法,以便所有Parent
个对象实现它。但是,在这种情况下,只有Child2
类实际上会在覆盖方法时实现任何行为。
你的想法?提前谢谢!
答案 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在此实例中很有用。这将允许对象本身(child1
,child2
等)使用其静态类型回叫您并采取适当的操作。