【问题标题】:C++ Overloading a Function Based on shared_ptr Derived ClassC++基于shared_ptr派生类重载函数
【发布时间】:2011-09-05 02:43:18
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    也许您应该将process() 方法移动到Parent 类(并在SonDaughter 中覆盖它),这样您就可以使用普通的虚函数解析来调用正确的。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        理想情况下,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 连同指向类的指针一起发送到Directorprocess 方法。

        【讨论】:

          猜你喜欢
          • 2017-04-03
          • 1970-01-01
          • 1970-01-01
          • 2015-07-23
          • 2021-03-19
          • 2013-08-02
          • 2018-02-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多