我有这样的代码:
class RetInterface {...}
class Ret1: public RetInterface {...}
class AInterface
{
public:
virtual boost::shared_ptr<RetInterface> get_r() const = 0;
...
};
class A1: public AInterface
{
public:
boost::shared_ptr<Ret1> get_r() const {...}
...
};
这段代码无法编译。
在视觉工作室中它提出了
C2555:重写虚函数返回类型不同并且不是
协变
如果我不使用boost::shared_ptr
但返回原始指针,代码编译(我理解这是由于协变返回类型在 C++ 中)。我可以看到问题是因为boost::shared_ptr
of Ret1
不是源自boost::shared_ptr
of RetInterface
。但我想回来boost::shared_ptr
of Ret1
用于其他类,否则我必须在返回后转换返回值。
- 难道我做错了什么?
- 如果不是,为什么语言是这样的——它应该是可扩展的,以处理这种情况下智能指针之间的转换?有理想的解决方法吗?
首先,这确实是 C++ 中的工作原理:派生类中的虚函数的返回类型必须与基类中的相同。有一个特殊的例外,即返回某个类 X 的引用/指针的函数可以被返回从 X 派生的类的引用/指针的函数覆盖,但正如您所注意到的,这不允许smart指针(例如shared_ptr
),仅用于普通指针。
如果你的界面RetInterface
足够全面,那么您不需要知道调用代码中实际返回的类型。一般来说,无论如何它都没有意义:原因get_r
is a virtual
函数首先是因为您将通过指针或对基类的引用来调用它AInterface
,在这种情况下,您无法知道派生类将返回什么类型。如果您用实际的A1
参考,你可以创建一个单独的get_r1
函数于A1
这就是你所需要的。
class A1: public AInterface
{
public:
boost::shared_ptr<RetInterface> get_r() const
{
return get_r1();
}
boost::shared_ptr<Ret1> get_r1() const {...}
...
};
或者,您可以使用访客模式或类似我的模式动态双调度将回调传递给返回的对象的技术,然后该对象可以使用正确的类型调用回调。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)