Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >重写虚拟函数返回类型不同,且不是协变量。

重写虚拟函数返回类型不同,且不是协变量。
EN

Stack Overflow用户
提问于 2011-08-06 13:27:42
回答 6查看 13.6K关注 0票数 9

啊,所以及时回来了。

我犯了一个奇怪的错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 'B::blah': overriding virtual function return type differs and is not covariant from 'A::blah'

造成问题的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A {
public:
    class Inner { };

    virtual Inner blah() = 0;
};

class B : public A {
public:
    class Inner2 : public Inner { };

    Inner2 blah() {
        return Inner2();
    }
};

我查找了错误,根据我在微软网站上找到的一页,类型可以是协变的方式之一是:

返回类型B::f中的类与返回类型D::f中的类相同,是返回类型D::f中类的一个明确的直接或间接基类,在D中可以访问

InnerInner2的情况不是这样吗?如果重要的话,我正在使用微软的VisualC++ 2010。

好的,多亏了John,我知道只有指针和引用可以是协变的。为什么会这样呢?派生的函数可以转换为Base,那么为什么不使用派生自同一事物的返回类型的虚拟函数将返回类型转换为基类之一呢?在我的例子中,让(A*(new B))->blah()返回一个实际上已经被抛出的Inner2Inner似乎是有意义的。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-08-06 13:29:37

只有指针和引用可以是协变的。

票数 18
EN

Stack Overflow用户

发布于 2013-05-28 02:00:32

假设你的例子奏效了。

考虑以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
A *a = some_function();
A::Inner inner = a->blah();

如果动态类型的a为B*,则a->blah()调用a::B->blah(),并返回B::Inner。然后将其静默地切片到A::Inner的一个实例中。一般来说,这(和任何类型的切片)不是你想要的。我觉得这是个很好的限制。

票数 3
EN

Stack Overflow用户

发布于 2011-08-06 14:19:53

如果您的请求被允许,这意味着通过基类对blah()的调用必须从Inner2转换到内部.转换是不可能的,因为调用方负责管理返回的对象(因为它不是由指针/引用返回,而是通过值返回),并将在堆栈上为其保留空间。因此,它只能处理内部类,而不能处理Inner2或其他祖先类。

所以你有了一个内部的例子,而不是Inner2.所以你没有任何优势..。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6969020

复制
相关文章
协变返回类型
协变返回类型:子类覆写了父类的一个方法,子类中方法的返回值类型可以是父类方法返回值类型的子类。 示例代码(Java编程思想)如下所示:子类WheatMill覆写了父类Mill的process方法,子类proces方法的返回值Wheat是父类proces方法返回值Grain的子类。
用户7886150
2021/01/30
7570
JAVA协变返回类型
协回返回类型表示:在导出类中覆盖基类的方法,可以返回基类方法的返回类型的某种导出类。 看一下例子 class zoo { } class animal { zoo speak() { return new zoo(); } } class tiger extends zoo { } class panda extends animal { @Override tiger speak() { return new tiger()
秋白
2018/05/24
1K0
Java漫谈-协变返回类型
Java SE5中添加协变返回类型,表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型。
WindCoder
2018/09/19
1.1K0
【类型挑战】获取函数返回类型,难度⭐️⭐️
Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~ 知识运用: 认识什么是returntypetype。 题目分析: 题目地址:2-medium-return-type 如上图所示,我们需要设计一个通用了类型工具还提取函数类型的返回类型,功能同内置的ReturnType。 题目解答: 测试用例: 给出的测试用例挺多但是没有特殊需要说明的,我们只需要通过设计的类型工具取出到通过Equal来进行比较即可。 /* _____________ 测试用例 _
前端小鑫同学
2022/12/26
1.2K0
【类型挑战】获取函数返回类型,难度⭐️⭐️
函数的变量+返回值
函数的变量: 局部变量 和 全局变量 Python中的任何变量都有特定的作用域 在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称之为局部变量 在一个文件顶部定义的变量可供文件中的任何函数调用,这些可以为整个程序所使用的变量称为全局变量 (1)、局部函数: #!/usr/bin/python def fun(): x = 100 ##定义一个内部的函数是 x = 100,只在fun() 内部有效。 print x fun() 执行结果: [[e
老七Linux
2018/05/31
4.9K0
GWAS分析中协变量的区分(性别?PCA?不同品种?)
plink进行GWAS分析时,协变量都要是数字协变量,因子协变量需要转化为dummy变量(哑变量)然后与数字协变量合并,通过--covar进行合并。
邓飞
2022/12/13
2K0
GWAS分析中协变量的区分(性别?PCA?不同品种?)
【Kotlin】函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )
函数引用 可以将 具名函数 转为 函数的参数值 , 只要可以使用 Lambda 表达式 参数的地方 , 就可以使用 函数引用 进行替代 ;
韩曙亮
2023/03/30
2.9K0
【Kotlin】函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )
详解javascript中的即时函数,内部函数,能重写自身的函数即时函数内部函数返回函数的函数能重写自己的函数小结
在上篇谈到匿名函数和回调函数的基础上,我们接着介绍javascript中的即时函数,内部函数,返回函数的函数,能重写自身的函数等几种常见的函数类型及使用方法。只需要大致了解匿名函数的概念,应该就能看懂这些内容
desperate633
2018/08/22
1.6K0
【Python】类型注解 ④ ( 函数类型注解 | 函数形参类型注解语法 | 函数返回值类型注解 )
由于定义 函数 时 , 没有为 函数形参 设置 类型注解 , 编写函数时 , PyCharm 工具无法提示没有类型的形参 :
韩曙亮
2023/10/11
3780
【Python】类型注解 ④ ( 函数类型注解 | 函数形参类型注解语法 | 函数返回值类型注解 )
【说站】python不同类型变量如何计算
以上就是python不同类型变量计算的方法,希望对大家有所帮助。更多Python学习指路:python基础教程
很酷的站长
2022/11/23
5070
【说站】python不同类型变量如何计算
【Kotlin 协程】Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )
在 Kotlin 协程 Coroutine 中 , 使用 suspend 挂起函数 以异步的方式 返回单个返回值肯定可以实现 , 参考 【Kotlin 协程】协程的挂起和恢复 ① ( 协程的挂起和恢复概念 | 协程的 suspend 挂起函数 ) 博客 ;
韩曙亮
2023/03/30
8.3K0
【Kotlin 协程】Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )
编程思想 之「多态、初始化顺序、协变返回类型」
在面向对象的编程语言中,有三个特性,分别为:封装、继承和多态。实现多态的前提是继承,多态的作用是消除类型之间的耦合关系。对于多态,我们常说的词有两个,分别为:向上转型和向下转型。
CG国斌
2018/03/20
1.3K3
编程思想 之「多态、初始化顺序、协变返回类型」
编程思想 之「多态、初始化顺序、协变返回类型」
在面向对象的编程语言中,有三个特性,分别为:封装、继承和多态。实现多态的前提是继承,多态的作用是消除类型之间的耦合关系。对于多态,我们常说的词有两个,分别为:向上转型和向下转型。
CG国斌
2019/05/26
4780
dotnet 5 从 IL 层面分析协变返回类型新特性
在 C# 9.0 里面添加的一个新特性是支持协变返回类型,也就说子类重写了基类的抽象或虚拟方法,可以在返回值里面返回协变的类型,也就是返回值的类型可以是继承原本子类返回值类型的子类。本文将来从 IL 的层面和运行时告诉大家这个新特性为什么需要 dotnet 5.0 才能支持
林德熙
2022/08/12
3630
函数出错返回的数据类型
返回NULL值有各种弊端,对此有一个比较经典的应对策略,就是应用空对象设计模式(Null Object Design Pattern)。
WindCoder
2020/04/09
2.2K0
父类返回子类类型的函数写法
我们有这么一个类,一看就是要写 Builder 模式。不过由于我们的这个 Event 的类型比较多,因此希望写一个父类,来一个子类感受下:
bennyhuo
2020/02/20
4.8K0
Python常看函数用法,返回值类型
在面向对象编程中,python 类有多继承特性,如果继承关系太复杂,很难看出会先调用那个属性或方法。
北山啦
2022/10/31
1.1K0
(十四)给函数返回值添加类型
在 TypeSctipt 中可以自动对返回值进行类型的推断,当然也可以手动限定返回值
老怪兽
2023/02/22
9580
Kotlin 上手记 —— 变量、函数和类型
就这么四种可见性,经过真正的尝试,是可以将子类的可见性放开的,比如就是说,父类的可见性是 protected,子类同样可以是 protected,或者改写成 public,这种放开,如果子类可见性修改成 private,则编译器直接报错,如下所示:
用户8928967
2021/08/20
6450
Kotlin 上手记 —— 变量、函数和类型
mybatis返回值为map类型时怎么处理_构造函数不能有返回类型
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
1.8K0
mybatis返回值为map类型时怎么处理_构造函数不能有返回类型

相似问题

重写虚拟函数返回类型不同,且不是协变量。

24

重写虚拟函数协变量返回类型(两个指针)

36

重写虚拟函数返回类型不同,在数据结构中不存在协变量。

20

虚拟常数协变量返回类型

10

重写不同返回类型的虚拟函数

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文