C++中的协变返回类型是指在派生类中重写基类的虚函数时,可以返回比基类函数返回类型更具体的派生类类型。不带指针的协变返回类型是指返回的类型不是指针类型。
优势:
应用场景:
推荐的腾讯云相关产品和产品介绍链接地址:
腾讯云提供了丰富的云计算产品和服务,以下是一些与C++开发相关的产品:
请注意,以上推荐的产品仅为示例,腾讯云还提供了更多与云计算相关的产品和服务,具体选择应根据实际需求进行。
参考链接: Java covariant返回类型 协变返回类型:子类覆写了父类的一个方法,子类中方法的返回值类型可以是父类方法返回值类型的子类。...示例代码(Java编程思想)如下所示:子类WheatMill覆写了父类Mill的process方法,子类proces方法的返回值Wheat是父类proces方法返回值Grain的子类。
协回返回类型表示:在导出类中覆盖基类的方法,可以返回基类方法的返回类型的某种导出类。...@Override tiger speak() { return new tiger(); } } panda继承了animal,并且重写了speak()方法,父类的speak...()方法的返回值类型是zoo,而子类重写speak()方法的返回值却是tiger,因为tiger继承了zoo,所以编译器不会报错。...因而也是一种合法的返回类型。
Java SE5中添加协变返回类型,表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型。...{ /** * 重写Mill的process()方法 * 协变返回类型允许返回更具体的Wheat类型,亦即此时的Wheat为协变返回类型 * @return...; System.out.println(g.getName()); // 因为是协变返回类型,所以可以向下转型 Wheat w = (Wheat) g;...协变返回类型允许返回更具体的Wheat类型 扩: 里氏代换原则(任何基类可以出现的地方,子类一定可以出现) 重写/覆盖规则: 1.重写方法不能比被重写方法限制有更严格的访问级别。...此处的Wheat即成了协变返回类型。 相关下载 点击下载
List 是和它的原来类型协变(共同变化)的。...() -> Cat 和 () -> Animal 的关系与 Cat 和 Animal 之间的关系一致,也就是说是在 Swift 中函数的返回值是协变的。...也就是说函数的参数是逆变的。 得到的结论是: 函数的参数是逆变的,返回值是协变的。 我们知道了变化的规则,就能判断出类型的关系,就可以知道一个类型是否可以替换另外一个类型。...其他类型的协变和逆变 上面我们提到了函数的参数和返回值的分别是逆变和协变,在 Swift 中除了函数,还有属性(property),范型(Generic)等。...对于范型来说,范型本身其实没有特殊的变化,它的变化与范型使用的环境紧密相关,如果是用作函数的返回值或者覆盖父类的 readonly 属性,它的协变的,如果用做函数的参数,它是逆变的,如果是用做覆盖父类的
协变返回类型 在 Java SE5 中,添加了协变返回类型,它表示在导出类中的被覆盖的方法可以返回基类方法的返回类型的某种导出类型。...对于上述协变返回类型的定义,读起来有些让人吐血,简单点,通过下面的程序理解协变返回类型: package com.hit.chapter8; /** * author:Charies Gavin...Luoyangred extends Flower { Peony kind() { return new Peony(); } } [002] 如上图所示,展示了使用协变返回类型后的效果...在 Java SE5 之前,强制导出类中被覆盖的方法必须返回基类方法的返回类型,但是在增加协变返回类型之后,我们可以让在导出类中被覆盖的方法返回基类方法的返回类型的某种导出类型,也就是说可以返回更加具体的返回类型...例如上例中的kind()方法,在 Java SE5 之前,只能返回Plant,但是在使用协变返回类型之后,我们可以直接返回更加具体的Peony类型。
协变返回类型 在 Java SE5 中,添加了协变返回类型,它表示在导出类中的被覆盖的方法可以返回基类方法的返回类型的某种导出类型。...对于上述协变返回类型的定义,读起来有些让人吐血,简单点,通过下面的程序理解协变返回类型: package com.hit.chapter8; /** * author:Charies Gavin...如上图所示,展示了使用协变返回类型后的效果。...在 Java SE5 之前,强制导出类中被覆盖的方法必须返回基类方法的返回类型,但是在增加协变返回类型之后,我们可以让在导出类中被覆盖的方法返回基类方法的返回类型的某种导出类型,也就是说可以返回更加具体的返回类型...例如上例中的kind()方法,在 Java SE5 之前,只能返回Plant,但是在使用协变返回类型之后,我们可以直接返回更加具体的Peony类型。
在 C# 9.0 里面添加的一个新特性是支持协变返回类型,也就说子类重写了基类的抽象或虚拟方法,可以在返回值里面返回协变的类型,也就是返回值的类型可以是继承原本子类返回值类型的子类。...类使用的是 abstract 或 virtual 的方法被重写,在重写的时候可以返回协变的类。...以下是返回值 Food 类型定义 public class Food { } public class Meat : Food { } 可以看到 Meat...是继承 Food 的类型,也就是说允许子类的返回值类型是重写的方法的子类。...在 C# 的抽象或虚拟方法都相当于定义了函数的虚表,存放在虚表空间槽。 这是为了确保如果我们使用基类型方法之一的签名来调用覆盖方法,我们仍然执行覆盖方法。
String 类型的 ArrayList 记录了 toString 方法返回值的泛型信息。...image.png 逆变后的继承关系 image.png 因此 Number 类型的 filter 过滤类可以认为是逆变之后的 Double 类型的 Filter 的子类型。...通过逆变,可以让泛型的约束变得更加宽松。 与协变不同,逆变放宽的是对父类的约束,而协变放宽的是对子类的约束。 但同样,逆变放宽类型约束是存在一定代价的: List<?...Object number = list.get(0); //只能作为顶层级的Object类 泛型的协变使用的是 ?...extends 通配符,使得子类型的泛型对象可以进行赋值,但同样会失去调用 add 存储功能时传递该泛型对象的能力: //泛型的协变 List<?
C++函数指针、指针函数、返回值为函数指针的函数浅谈 引言 函数指针、指针函数是C中重要而容易混淆的概念,博主将通过两个实例来说明这两个截然不同的概念。...而返回值为函数指针的指针函数就更难理解了,放在文章的最后来介绍。 函数指针 函数指针是一种特殊的 指针,它指向函数的入口。...指针函数是一种返回值为指针的 函数。...例如A *createA();声明了一个返回值为指向A类型的指针的,参数列表为空的函数(这句话读起来可能有一··绕口),实例说明 /** * 作者:lyn * 时间:2018.10.30 * 该程序用来演示指针函数...A的指针的函数 A *createA() { return new A(1); } int main(){ //创建一个指向A类型的指针,并调用createA创建一个A
1.接口简介 Interface 是一组抽象方法(未具体实现的方法,仅包含方法名参数返回值的方法)的集合,如果实现了 interface 中的所有方法,即该类型就实现了该接口。...注意: (1)接口中不能含有属性; (2)每种类型都能实现多个接口; (3)未初始化的接口类型变量的值为 nil。...接口声明格式: type InterfaceName interface { //方法列表 } 2.函数返回类型是接口时返回对象的指针还是值 函数返回类型是接口时返回对象的指针还是值,这个要看具体的需要...期望原对象在后续的操作中被修改则返回对象的指针。返回对象的值则返回的是对象的副本,对对象副本的修改不会影响原对象。 返回对象的指针示例。...createEmployeeObj() o.Set() o.Print() e.Print() } 输出结果: company=alibaba company=alibaba 可见函数返回类型是接口时返回对象的指针
逆变和协变 先来段维基百科的定义: 协变与逆变(covariance and contravariance)是在计算机科学中,描述具有父/子型别关系的多个型别通过型别构造器、构造出的多个复杂型别之间是否有父...协变(Covariance) 那么想象一下,现在我们分别有这两个子类型的数组,他们之间的父子关系应该是怎么样的呢?...那么,对于 type MakeArray = T[] 这个类型构造器来说,它就是 协变(Covariance) 的。...后,我们可能会用一个不带 bark 属性的普通的 animal 类型来传给 visitDog。...在 TS 中 当然,在 TypeScript 中,由于灵活性等权衡,对于函数参数默认的处理是 双向协变 的。
指针与引用类型参数 II . 指针作为参数和返回值 III . 引用参数简介 IV . 引用作为参数和返回值 I . 博客总结 . 指针与引用类型参数 ---- 1 ....讨论问题 : 本章只针对一点进行讨论 , 那就是对两种类型的参数修改 , 是否影响到外部的变量 ; 传入什么样的参数才能修改外部变量 , 即 参数当返回值使用 ; 2 ....参数使用语言环境 : 引用类型参数只能在 C++ 环境中使用 , 指针类型参数可以用于 C / C++ 两种语言环境中 , 因此很多基础库 如 FFMPEG , OpenSL ES 等使用的都是指针类型参数...C++ 中的引用参数 : C++ 在 C 语言基础上扩展了 引用 数据类型 , 使用引用可以替代上面的指针作为参数的情况 , 使参数具有返回结果的能力 ; 3 ....作用及意义 : ① 具有返回值能力 : 使用引用作参数 , 可以将参数当做返回值使用 ; ② 提高参数传递效率 : 大型对象作参数时 , 使用引用类型 , 可以提高参数传递效率 ; 更多关于引用的内容参考
参考链接: C++编程默认参数(参数) 假设要利用模板元编程获取位于index的参数的类型: template struct ArgTypeAt...{ // FuntionType的返回值类型和参数类型?...int(int, short, float)了,里面含有各参数的类型。...要把FuntionType分离成返回值类型和参数类型,方法是利用模板特化,然后参数类型是一个包,再把参数包展开就能得到各位置参数的类型: template<int index, class FuntionType...(默认是__cdecl)改成__stdcall这个模板特化就不匹配了,因为修饰符也是类型的一部分,而C++的泛型并没有修饰符变了还能匹配的方法(只有类型变了能匹配)。
的 返回值 不是 " 函数重载 " 的 判断标准 ; 二义性 : 如果 函数重载 与 默认参数 结合使用 , 出现了二义性 , 编译直接失败 ; 函数指针赋值重载函数 : 根据 函数指针 类型中的 参数列表类型...); return_type : 函数指针 指向的函数 的 返回值类型 ; func_ptr : 函数指针 名称 , 使用该 名称 也可以调用函数 , 用法与函数名相同 ; parameter_list...函数类型 定义 函数指针 首先 , 使用 typedef 关键字 , 定义 函数类型 , 下面的代码 定义了 函数类型 func , 函数的 参数列表是 2 个 int 参数 , 返回值是 int ;...// 定义函数类型 func , 参数列表是 2 个 int 参数 , 返回值是 int typedef int (func)(int a, int b); 然后 , 通过定义的 func 函数类型...= add; 4、代码示例 - 不同方式定义函数指针 在下面的代码中 , 分别使用上述章节中讲解的三种方式 , 定义了函数指针 ; 代码示例 : // 包含 C++ 头文件 #include "iostream
一、函数返回 静态变量 / 全局变量 的 引用 / 指针 1、函数返回局部变量引用或指针无意义 上一篇博客 【C++】C++ 引用详解 ③ ( 函数返回值不能是 “ 局部变量 “ 的引用或指针 | 函数内的...“ 局部变量 “ 的引用或指针做函数返回值无意义 ) 得出如下结论 : 函数的返回值 是 “ 局部变量 “ 的 引用 或 指针 时 , 是无意义的 ; 函数 执行完毕后 , 该 函数对应的 栈内存 会被回收..., 相应的 局部变量 地址 也有没有了意义 , 此时 , 再持有一个 函数返回的 没有意义的 引用 / 指针 , 取出的值是随机无意义的值 ; 2、函数返回静态变量/全局变量的引用或指针 函数 返回的是..." 静态变量 " 或 " 全局变量 " 的 引用 / 指针 时 , 是可以的 ; 如果 函数 的 返回值 是 静态变量 或 全局变量 的引用 , 这两种变量 一旦分配内存后 , 在整个程序的生命周期中..., 该内存都不会被回收 , 返回它们的 引用 / 指针 , 可以正常访问 对应 内存中的数据 ; 3、代码示例 - 函数返回静态变量/全局变量的引用或指针 在下面的代码中 , fun 函数作为 参照
C++指向函数的指针作函数参数 学到这里的读者应该知道在C语言中,函数指针变量常见的用途之一是作为函数的参数,将函数名传给其他函数的形参,这样可以在调用一个函数的过程中根据给定的不同实参调用不同的函数,...C++返回指针值的函数 在C++中,一个函数可以带回一个整型值、字符值、实型值 等,也可以带回指针型的数据,即地址,带回的值的类型是指针类型,返回指针值的函数简称为指针函数。 ...定义指针函数的一般形式为 类型名 *函数名(参数列表); C++指针数组 在C++中,如果一个数组,其元素均为指针类型数据,该数组称为指针数组,也就是说,指针数组中的每一个元 素相当于一个指针变量,它的值都是地址...一维指针数组的定义形式为 类型名 *数组名 [数组长度]; int *point[5]; 可以用指针数组中各个元素分别指向若干个字符串,使字符串处理更加方便灵活。...C++返回指针值的函数 | 按字母顺序由小到大输出 更多案例可以go公众号:C语言入门到精通
3.1定义 派生类中与基类同返回值类型、同名和同参数的虚函数重定义,构成虚函数覆盖,也叫虚函数重写。 关于返回值类型存在一种特殊情况,即协变返回类型(covariant return type)。...3.2虚函数重写与协变返回类型 如果虚函数函数返回指针或者引用时(不包括value语义),子类中重写的函数返回的指针或者引用是父类中被重写函数所返回指针或引用的子类型(这就是所谓的协变返回类型)[4]^...cout<<"In Base"<<endl; return *(new A); } }; class Derived:public Base{ public: //返回值协变...关于三者的对比,李健老师在《编写高质量代码:改善C++程序的150个建议》给出了较为详细的总结,如下表所示: 三者 作用域 有无virtual 函数名 形参列表 返回值类型 重载 相同 可有可无 相同....第一版.北京:机械工业出版社,2012.1:122-125 [4]C++基础:函数重写(override)与协变返回类型(covariant return type)
一、函数指针做函数参数 1、使用函数指针间接调用函数 在上一篇博客 【C++】函数指针 ③ ( 函数指针语法 | 函数名直接调用函数 | 定义函数指针变量 | 使用 typedef 定义函数类型 | 使用..., 调用的函数可以动态指定 ; 2、函数指针做参数 定义了 如下 函数指针类型 pFun_add , 其类型为 int (*)(int, int) , 该指针指向一个 类型为 int (int, int..., int); 定义函数 接收 pFun_add 类型的形参作为参数 , 该类型是 函数指针类型 , 也就是 函数接收一个 函数指针类型参数 , 在该函数中调用 函数指针 指向的 函数 ; // 传入函数指针...约定了 函数的 参与者 ; 函数返回值类型 约定了 函数的 执行结果 ; 只要 将 子任务 按照 上述 " 函数指针类型 " 的约定 , 开发出 符合要求 的 函数 , 就可以将其作为一个 子任务 传递到...; 错误处理 : 使用函数指针 , 将错误处理函数作为参数传递给其他函数 , 在发生错误时立即调用适当的错误处理函数 , 无需返回到调用堆栈中的较高层次 ; 二、代码示例 - 函数指针做函数参数 代码示例
2、函数返回值特点 函数 的 返回值 几乎很少是 引用 或 指针 ; 函数 的 计算结果 经常是借用 参数中的 地址 / 引用 进行返回的 , 函数 的 返回值 一般返回一个 int 类型的值 , 如果...如果 想要 在 函数中 , 返回 引用 / 指针 , 函数局部变量的 引用 / 指针 是返回不出来的 , 即使强行返回 引用 / 指针 , 也是当前 局部变量 被 分配的 栈内存 地址 , 该函数 执行完毕后..., 会被回收 , 失效 int num = 20; int& a = num; return a; } // 返回值是指针类型 int* getNum3() { int num = 30;...return # } int main() { // 函数返回 int 类型变量 赋值给 int 类型变量 num1 int num1 = getNum(); // 函数返回 int...(); // 将 返回的 指针赋值给 int 类型指针 // 这里只能记录地址 , 没有将值取出来保存 // 该地址马上就要被其它数据覆盖了 int* num3 = getNum3();
领取专属 10元无门槛券
手把手带您无忧上云