繁体   English   中英

C++ 重载一个 Function 基于 shared_ptr 派生的 Class

[英]C++ Overloading a Function Based on shared_ptr Derived Class

有很多与此类似的 SO 问题,但我无法准确找到我正在寻找的内容。 如果这是重复的,我很抱歉。

我有一个Parent class 和两个继承自它的派生类:

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

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

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

最后,我想要一个 class 根据它指向的派生类来处理shared_ptr<Parent> 我可以使用 function 重载来达到这个效果的问题是:

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));

不可能像那样重载,您需要一个 switch 语句来在Director的一个方法中实现与调度类似的东西。

也许您应该将process()方法移动到Parent class (并在SonDaughter中覆盖它),这样您就可以使用普通的虚拟 function 分辨率来调用正确的分辨率。

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

您的对象可能自己不知道 shared_ptr,但通常简单的引用就足够了。

理想情况下, Parent会提供一个足够丰富的接口,让Director能够正确处理每个孩子,而无需知道它是哪个孩子。

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

如果由于某种原因无法实现这一点,则有很多设计选择。 如上所述,您可以将进程与子 class 链接在一起。 如果这不适合您的需求,例如,您可以将流程与主管隔离开来:

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连同指向 class 的指针一起发送到Directorprocess方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM