Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;基于共享的ptr派生类重载函数_C++_Inheritance_Polymorphism_Overloading_Shared Ptr - Fatal编程技术网

C++ C++;基于共享的ptr派生类重载函数

C++ C++;基于共享的ptr派生类重载函数,c++,inheritance,polymorphism,overloading,shared-ptr,C++,Inheritance,Polymorphism,Overloading,Shared Ptr,有很多类似的问题,但我找不到确切的答案。如果这是重复的,我很抱歉 我有一个父类和两个从中继承的派生类: class Son : public Parent { ... }; class Daughter : public Parent { ... }; 然后我向基类声明两个shared_ptr,并使用shared_ptr向每个派生类实例化它们: shared_ptr<Parent> son = shared_ptr<Son>(new Son()); shared_ptr

有很多类似的问题,但我找不到确切的答案。如果这是重复的,我很抱歉

我有一个
父类和两个从中继承的派生类:

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-son=shared_ptr(new-son());
共享子元素=共享子元素(新子元素());
最后,我希望有一个类,它根据它指向的派生类处理
shared\ptr
。问题是,我能否使用函数重载来实现此效果:

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);
shared_ptr-son=shared_ptr(new-son());
共享子元素=共享子元素(新子元素());
董事;
程序主任(儿子);
程序主任(女儿);
现在我不得不这样做(我想避免):

director.process_-son(boost::shared_-polymorphic_-downcast(son));
处理子对象(boost::shared\u多态子对象(downcast));

这样的重载是不可能的,您需要一个switch语句来在
控制器上的一个方法中实现类似的分派


也许您应该将
process()
方法移动到
父类
类(并在
子类
子类
中重写它),通过这种方式,您可以使用普通的虚拟函数解析来调用正确的函数。

我不确定是否有更好的方法,因此我通常使用访问者模式或类似的双重分派技巧来满足这种需要


您的对象可能不知道自己的共享\u ptr,但通常简单的引用就足够了

理想情况下,
父级
将提供足够丰富的接口,以便
控制器
正确处理每个子级,而无需知道它是哪个子级

class Director {
public:
    void process(shared_ptr<Parent> obj);
};
班主任{
公众:
作废流程(共享的ptr 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
  }
  ...
};
类进程子:公共进程,私有进程子{
公众:
void SpecificProc1(共享对象){
//使这部分流程基于类Son
}
void SpecificProc2(共享对象){
//使这部分流程基于类Son
}
...
};
子对象执行类似的操作,并将相应的
过程
与指向类的指针一起发送到
控制器
过程
方法

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
  }
  ...
};