问题描述
||
有很多类似的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
方法。