问题标签 [covariant-return-types]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
12865 浏览

c++ - C++ 中 clone() 的最佳签名是什么?

正如 Scott Myers 所写,您可以利用 C++ 类型系统中的放松来声明 clone() 以返回指向正在声明的实际类型的指针:

编译器检测到 clone() 返回一个指向对象类型的指针,并允许 Derived 覆盖它以返回一个指向derived 的指针。

最好让 clone() 返回一个暗示所有权语义转移的智能指针,如下所示:

不幸的是,约定的放宽不适用于模板化智能指针,并且编译器将不允许覆盖。

所以,看来我有两个选择:

  1. 让 clone() 返回一个“哑”指针,并记录客户负责处理它的文件。
  2. 让 clone() 返回一个智能基指针,并让客户端在需要时使用 dynamic_cast 将它们保存到派生指针。

这些方法之一是首选吗?或者有没有办法让我吃掉我的所有权语义转移并拥有我强大的类型安全性?

0 投票
1 回答
212 浏览

c++ - 使用带有虚函数的协变返回类型的 C++ 无效转换错误

在下面的代码中,我可以将 的返回值分配给D::clone()指向 的指针B,但不能分配指向 的指针D。是否可以从基指针的调用中返回实际的多态类型?

0 投票
2 回答
323 浏览

java - 协变返回类型和抛出声明

在下面的层次结构中,

在此处输入图像描述

下面是这个问题的编译代码:

在上面的代码中,interface I4interface I5得到编译,因为,

1)

interface I4 extends I1, I2, I3只有当,

T1 extends T2&& T1 extends T3_T2 extends T3

E1 extends E2& E1 extends E3& E2 extends E3

2)

interface I5 extends I1, I2, I3并仅在以下情况下覆盖m()T5 m() throws E5;

T5 extends T1&& T5 extends T2_T5 extends T3

E5 extends E1& E5 extends E2& E5 extends E3

关于协变返回类型抛出声明方面,

我可以说,代码编译成功是因为上面两条规则有效且必要吗?

0 投票
2 回答
242 浏览

c++ - C++ 多态克隆:如何从基指针获取派生指针?

这已经是我发送的关于这个 subjet 的几篇帖子,如果这让你们中的一些人感到困扰,我深表歉意。在玩了几天并尝试了不同的替代方案(模式)之后,我得出了以下结论,这使我能够更好地提出我的问题。

我有一个向量,Base *并且有各种Derived<T>从 Base 派生的类。不同的类参数 T 以前向声明的开头声明。我需要的是从中获取一对对象vector<Base *>并应用function(Derived<T1> obj1, Derived<T2> obj2)使用模板以进行某种双重调度。但是,当我从向量中获取一个元素时,我无法将指向 Base 的指针转换为指向 Derived 的指针。因此,我不能使用function(Derived<T1> obj1, Derived<T2> obj2).

当然,这可以简单地使用dynamic_cast<Derived<T> *>(base_ptr). 但是,这不是我想要的,因为要这样做,必须事先知道 T,这里不是这样。我必须能够从向量中选择任何元素,而无需知道它们的Derived<T>类型。

因此,我尝试了多态克隆。尽管它使用协变返回类型,但不幸的是,它不起作用。正如不同人在SO中解释的那样,根据C++标准,原因是在编译时,编译器仍然不知道对象的完整类型。因此,尽管人们期望 clone() 应该返回 a Derived<T> *,但它返回 a Base *

接下来的几行代码表达了我的意思。一般来说,多态克隆用于以下情况:

这不是我想要的。我需要的是一个指向派生的指针:

在这里,编译器抱怨说Base *不能将 type 的对象分配给 type 的对象Derived *。因此,我不能使用*d1in function(,)

我也尝试了非虚拟接口 (NVI) 方法,但它不起作用。

有谁知道如何解决上面的简单代码,特别是最后一行?提前谢谢了。

0 投票
2 回答
9886 浏览

c# - 为什么 Resharper 使用此代码说“从字符串 [] 到对象 [] 的协变数组转换会导致写入操作时出现运行时异常”?

这段代码:

将 R# curmudgeon 变成类似抱怨,“从字符串 [] 到对象 [] 的协变数组转换可能导致写入操作时出现运行时异常”。

实际上,这段代码运行良好——组合框填充了月份值;Resharper 是关于什么的,我能做些什么来减轻它的疑虑?

如果只是通用列表可能包含错误数据,我不会担心 - 如果有问题,追踪问题很容易。

0 投票
1 回答
83 浏览

c++ - How to make a sub class return an object (copy) of itself in a virtual method

I am currently trying to understand inheritance in C++, but I am quite confused as to why I can't make a descendant class of my main class return an object of the same type as said descendant class from some operator methods I overloaded.

The classes are defined like this (this is an abridged version):

And this is how the methods are defined:

So in this case, both methods should return a copy of the vector + operand, but it doesn't work when I use inheritance. If I remove the first class' virtual methods (Vect) from the file, everything works fine. Otherwise the compiler complains about an invalid covariant return type.

I tried doing it with a reference, but returning a reference to a temporary object is undefined behaviour as far as I know, and I wish for the methods to return a copy of my object and not directly modify it.

Is there any way to do that?

0 投票
2 回答
1267 浏览

c++ - C++ 虚方法返回不同的派生类型

参考这个问题:C++ virtual function return type

让我们考虑以下一组对象。

这些对象可以按以下方式使用吗?

我假设由于返回类型是协变的(?),上面的对象集是合法的 C++。是否会调用适当的 Get() 方法?可以为指针一/二分配 Get() 方法的返回值而不进行强制转换吗?

0 投票
1 回答
163 浏览

c++ - 虚拟继承,显式实例化——返回派生类引用/指针(协变类型)

.hpp

.cpp

我需要一些方法来返回引用以制作“链”/定义赋值运算符/等:

我还必须处理虚拟继承以避免“钻石问题”(为简单起见,此处省略)。

但是,这不起作用:

MSVC

显式实例化在没有虚拟继承的情况下工作得很好。所以我想知道这里有什么问题。(如果没有返回对象引用/指针的成员函数,一切正常。)

0 投票
1 回答
81 浏览

java - 为什么这个协变返回类型声明不会产生未经检查的警告?

为什么以下代码不会产生编译时未经检查的警告:

而以下实际上是:

我实际上是在 JLS 中寻找这种行为的参考。

0 投票
0 回答
18 浏览

inheritance - 协变返回类型:返回另一个继承类指针

我有这个代码:

编译时出错: 覆盖虚函数返回类型不同且不是协变的 我该如何解决?