[英]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 (并在Son
和Daughter
中覆盖它),这样您就可以使用普通的虚拟 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 的指针一起发送到Director
的process
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.