Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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++ 使用boost::shared_ptr时的多态性_C++_Boost_C++11_Polymorphism_Overriding - Fatal编程技术网

C++ 使用boost::shared_ptr时的多态性

C++ 使用boost::shared_ptr时的多态性,c++,boost,c++11,polymorphism,overriding,C++,Boost,C++11,Polymorphism,Overriding,如果我有一个包含父类A和子类B和C的继承层次结构,那么如何通过boost::shared_ptr使用多态性,以便 virtual void my_func(boost::shared_ptr<A> x) = 0; virtualvoid my_func(boost::shared_ptr x)=0; 可以实现为 void my_func(boost::shared_ptr<B> x); void my_func(boost::shared_ptr x); 及 vo

如果我有一个包含父类A和子类B和C的继承层次结构,那么如何通过boost::shared_ptr使用多态性,以便

virtual void my_func(boost::shared_ptr<A> x) = 0;
virtualvoid my_func(boost::shared_ptr x)=0;
可以实现为

void my_func(boost::shared_ptr<B> x);
void my_func(boost::shared_ptr x);

void my_func(boost::shared_ptr x);
??即使有共享的ptr概念,多态性仍然有效吗


(很好地知道这对于STD::SyrdYpPTR,Boost)

> P>当C++中重写函数时,参数类型必须与基类中的函数相同。唯一允许的变化是,如果基类返回指针或引用,则重写函数可能具有协变返回类型

对于参数类型,任何潜在的变化都取决于它是什么类型的参数:

  • 输入参数必须是逆变的:如果您知道更特殊的类可以处理更一般的参数,则可以允许传入这些参数
  • 输出参数必须是协变的:任何调用都可以处理基类型的对象,也就是说,当知道类是特殊的时,可以得到更特殊的东西
  • C++没有输入或输出参数的指示,即参数始终是输入和输出参数。因此,它们是不变的

这些函数签名不是等效的。所以我不认为您在这里完全重写了。您能详细说明一下第一点吗:为什么输入args可以是逆变的?为什么不像输出/retval那样是协变的?@IgorR.:输入参数必须是从(LSP)直接派生的逆变参数:如果可以调用
base.f(x)
,则必须调用
derived.f(x)
。当
derived
x
限制为与
base
使用的类相比的派生类时,很明显
derived.f(x)
不能用所有输入调用
base.f(x)
可以是,并且存在LSP冲突。
void my_func(boost::shared_ptr<C> x);