我的印象是unique_ptr
可以以与普通指针相同的方式推断类层次结构,但是当我尝试重载这样的函数时:
void func(unique_ptr<Derived1>& d1);
void func(unique_ptr<Derived2>& d2);
然后调用这样的函数之一:unique_ptr<Base> b = make_unique<Derived1>();
func(b);
我收到一条错误消息,说 no instance of overloaded function "func" matches the argument list
. b 的运行时类型为 Derived1
,所以我预计会调用第一个重载。另外,当我返回
unique_ptr
从函数中,编译器能够将派生类(?不确定适当的术语)转换为基类,这样这样的东西就可以工作:unique_ptr<Base> create(){
return make_unique<Derived1>();
}
通常在我的代码中,我将变量声明为此类函数的结果。它们被声明为基类,但具有派生的运行时类型,我想将它们传递给一个重载函数。如何以与涉及类层次结构的常规指针相同的方式重载函数?
最佳答案
你是对的,所有标准智能指针的隐式转换操作都是对原始指针的建模。这允许编译第二个片段,即
unique_ptr<Base> create(){
return make_unique<Derived1>();
}
但是,对第一个片段存在误解,因为从基类到派生类从来没有内置的隐式向下转换。使用普通指针,void func(Derived1* d1);
void func(Derived2* d2);
Base* b = new Derived1();
func(b);
也不会编译。这在基本的 OOP 意义上是有意义的——通过基类接口(interface)查看继承层次结构中的对象,并隐藏实际的具体运行时类型。如果您需要具有这种分派(dispatch)的设计,您想了解“访问者”设计模式,它实现了一种称为双重(或多重)分派(dispatch)的技术。但是,实现这一点所需的样板文件的数量给了你一个提示,为什么该语言不提供这种作为内置的调度。
关于c++ - 基于unique_ptr参数指针类型的重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67871126/