有很多与此类似的问题,但我找不到我想要的东西。如果这是重复的话,我很抱歉。
我有一个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));
答案 0 :(得分:7)
不可能像这样重载,你需要一个switch语句来实现与Director
上的一个方法中的dispatch类似的东西。
也许你应该将process()
方法移到Parent
类(并在Son
和Daughter
中覆盖它),这样你就可以使用普通的虚函数解析打电话给对方。
答案 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}}方法。