C ++基于shared_ptr派生类重载函数

时间:2011-05-30 23:32:25

标签: c++ inheritance polymorphism overloading shared-ptr

有很多与此类似的问题,但我找不到我想要的东西。如果这是重复的话,我很抱歉。

我有一个Parent类和两个从中继承的派生类:

class Son : public Parent { ... };
class Daughter : public Parent { ... };

然后我向Base类声明了两个shared_ptr,并使用shared_ptr将它们实例化为每个派生类:

shared_ptr<Parent> son = shared_ptr<Son>(new Son());
shared_ptr<Parent> daughter = shared_ptr<Daughter>(new Daughter());

最后,我希望有一个类根据它指向的派生类来处理shared_ptr<Parent>。我可以使用函数重载来实现这个效果是问题:

class Director {
public:
    void process(shared_ptr<Son> son);
    void process(shared_ptr<Daughter> daughter);
    ...
};

所以我希望能够编写以下代码:

shared_ptr<Parent> son = shared_ptr<Son>(new Son());
shared_ptr<Parent> daughter = shared_ptr<Daughter>(new Daughter());
Director director;
director.process(son);
director.process(daughter);

现在我必须做(我想避免):

director.process_son(boost::shared_polymorphic_downcast<Son>(son));
director.process_daughter(boost::shared_polymorphic_downcast<Daughter>(daughter));

3 个答案:

答案 0 :(得分:7)

不可能像这样重载,你需要一个switch语句来实现与Director上的一个方法中的dispatch类似的东西。

也许你应该将process()方法移到Parent类(并在SonDaughter中覆盖它),这样你就可以使用普通的虚函数解析打电话给对方。

答案 1 :(得分:3)

我不确定是否有更好的方法,所以我通常会使用访客模式http://en.wikipedia.org/wiki/Visitor_pattern或类似的双重调度技巧来满足这种需求。

您的对象可能不知道shared_ptr给自己,但通常简单的引用效果很好。

答案 2 :(得分:0)

理想情况下,Parent会为Director提供足够丰富的界面来正确处理每个孩子,而无需知道它是哪个孩子。

class Director {
public:
    void process(shared_ptr<Parent> obj);
};

如果由于某种原因无法实现,则有许多设计选项。如上所述,您可以将进程与子类链接在一起。如果这不符合您的需求,您可以将流程与导演隔离开来:

class ProcessSon: public Process, private Son {
public:
  void SpecificProc1(shared_ptr<Parent> obj) {
    // Make this part of the process based on class Son
  }

  void SpecificProc2(shared_ptr<Parent> obj) {
    // Make this part of the process based on class Son
  }
  ...
};

Daughter执行类似操作,并将适当的Process与指向该类的指针一起发送到process的{​​{1}}方法。