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

问题描述

|| 有很多类似的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<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));
    

解决方法

        不可能那样重载,您需要一个switch语句才能在
Director
的一个方法中实现与dispatch相似的操作。 也许您应该将
process()
方法移至
Parent
类(并在
Son
Daughter
中覆盖它),这样您可以使用正常的虚函数解析来调用正确的方法。     ,        我不确定是否有更好的方法,所以我通常会根据需要使用“访问者”模式http://en.wikipedia.org/wiki/Visitor_pattern或类似的双重分发技巧。 您的对象可能不了解他们自己的shared_ptr,但通常简单的引用就可以很好地工作。     ,        理想情况下,“ 0”将提供足够丰富的接口,以使“ 9”能够正确处理每个孩子,而无需知道它是哪个孩子。
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
和指向类的指针发送到to9ѭ的
process
方法。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...