首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么指向实现接口的项的智能指针向量不能与该接口协变?

指向实现接口的项的智能指针向量不能与该接口协变的原因是,智能指针的协变性是基于指针类型的协变性,而不是基于指向的对象类型的协变性。

在C++中,协变性是指派生类指针可以隐式转换为基类指针的能力。这意味着如果一个类B是类A的派生类,那么指向B的指针可以隐式转换为指向A的指针。这种协变性在许多情况下非常有用,可以实现多态性和灵活的代码设计。

然而,当涉及到智能指针时,情况有所不同。智能指针是一种封装了指针的对象,它提供了自动内存管理和其他功能。智能指针的类型是与指向的对象类型相关的,而不是与指针类型相关的。

当我们使用智能指针来管理实现某个接口的对象时,这些对象可能是不同的派生类的实例。尽管它们都实现了相同的接口,但它们的实际类型是不同的。因此,将指向这些对象的智能指针放入同一个向量中时,向量的类型将取决于指针所指向的对象的类型。

由于向量的类型是与指针所指向的对象类型相关的,而不是与指针类型相关的,所以无法实现智能指针向量与实现接口的项之间的协变性。这意味着不能将指向不同派生类对象的智能指针放入同一个向量中,并期望向量的类型与接口类型相匹配。

总结起来,智能指针向量不能与实现接口的项协变,是因为智能指针的协变性是基于指针类型的协变性,而不是基于指向的对象类型的协变性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++中多态

(基类与派生类虚函数返回值类型不同) 三同中,返回值可以不同,但是要求返回值必须是一个父子类关系指针或者引用。...//:返回值可以不同,但是返回值必须是一个父子类关系指针或引用 class Person { public: virtual Person* BuyTick() { cout << "Person...class A {}; class B:public A {}; //:返回值可以不同,但是返回值必须是一个父子类关系指针或引用 class Person { public: virtual...,可以实例出对象 return 0; } 接口继承和实现继承 ①实现继承: 普通函数继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承是函数实现。...②接口继承: 虚函数继承是一种接口继承,派生类继承是基类虚函数接口,目的是为了重写,达成多态,继承接口。所以如果不实现多态,不要把函数定义成虚函数。

81920

三大特性之多态

多态构成必须要满足两个条件: 1.必须要通过父类引用或者指针作为形参来调用 为什么一定要是父类引用或者指针,对于这个问题《深度探索C++模型》中这样说:“一个pointer或一个reference...只有它们所指向内存大小和解释方式 而已”。 对于上述话可以这样理解: 指针和引用类型只是要求了基地址和这种指针所指对象内存大小,与对象类型无关,相当于把指向内存解释成指针或引用类型。...重写两个例外 1. 子类对于父类函数重写,返回类型可以不同,但必须要是返回父子类关系指针或引用(即基类虚函数返回基类对象指针或者引用,派生类虚函数返回派生类对象指针或者引用),称为 class...虚函数继承是一种接口继承,子类继承是基类虚函数接口,目的是为了重写,达成多态,继承接口。所以如果不实现多态,不要把函数定义成虚函数 。...但这个类大小为4字节 这是因为如果一个类中有虚函数,那么该类中会有一个隐藏指针指针指向一个虚函数表。

15920

2022年Unity面试题分享

B > 类B实现接口所有方法 接口要小而精,定义一组方法,继承接口派生类要实现接口所有方法。...存在 a引用地址在线程栈中,数据内容在托管堆中 b引用地址在线程栈中,数据内容指向A托管堆中内容 B删除,只是删除b引用地址 ---- 【重点面试题】29、C#引用和C++指针区别 C#...:都是地址 指针指向一块内存,它内容是所指内存地址;而引用则是某块内存别名。...sizeof 引用”得到是所指向变量(对象)大小,而“sizeof 指针”得到指针本身大小; 引用是类型安全,而指针在不安全模式下 ---- 【重点面试题】30、using作用 资源...A*算法实现思路? 1.面向对象OOP特性有哪些?结合具体案例说一下。 2.程,进程,线程有什么区别,程能够举个例子吗? 3.冒泡排序怎么做?时间复杂度? 4.二叉树是怎么样

3.8K10

【C++】多态

(可以认为子类继承了父类虚函数接口,重写了实现,也称为接口继承) 注意与隐藏区别。...注意⚠: 在重写基类虚函数时,派生类虚函数不加virtual关键字,也可以构成重写(可以认为继承后基类虚函数被继承下来了在派生类中依旧保持虚函数属性),但是种写法不是很规范,建议这样使用 但是父类...3.2 虚函数重写第二个例外: 派生类重写基类虚函数时,与基类虚函数返回值类型可以不同。...但是是有要求: 基类虚函数必须返回基类对象指针或引用,派生类虚函数必须返回派生类对象指针或引用,我们把这种情况称为。...虽然子类test是继承下来,但是继承下来test函数中this指针类型是不会,还是父类指针A*(继承下来函数参数类型是不会)。

8810

【C++】从零开始认识多态

3.1 上面我们说了多态条件:父子虚函数要求三同。但是却有这样一个特殊情况:!...:派生类重写基类虚函数时,与基类虚函数返回值类型不同: 基类虚函数返回基类对象指针或者引用 派生类虚函数返回派生类对象指针或者引用 这样情况称为。...(注意一定是:基类返回“基类”,派生类返回“派生类”): 但是结果确实正常,依然构成多态,这样情况就称为!!!...test函数调用 func函数,参数this指向是B类(指向谁调用谁),所以就会调用B类func函数B-> 重写本质是对函数实现进行重写,函数结构部分(包括参数,缺省值,函数名,返回值等)与基类一致...具体汇编语言实现还是比较直白。 注意同类型虚表是一样!!! 满足多态,那么运行时汇编指令会去指向对象虚表中找对应虚函数进行调用!!!

7010

【C++进阶】多态理解

接口继承和实现继承 实现继承:普通函数继承是一种实现继承; 接口继承:虚函数继承是一种接口继承,如果不实现多态,不要把函数定义成虚函数。...例外:              a.派生类可以不加 virtual  ,因为派生类已经继承了基类 virtual;              b.(基类虚函数返回基类对象指针或者引用,派生类虚函数返回派生类对象...                    指针或者引用时,称为) 构成条件 1.调用函数是重写虚函数; 2.必须通过基类指针或者引用调用虚函数。...,一个在基类,一个在派生类;            2.都必须是虚函数;            3.满足三同(函数名,返回值,参数列表相同(除外)); 总结 1.重写比重定义条件更加严苛; 2.两个基类和派生类同名函数...虚函数表 其实基类和派生类虚函数都会被放进虚函数表(简称虚表)里,类实例化出对象后会生成一个指针(_vfptr),指向虚函数表,其实虚函数表就是一个函数指针数组,里面存着虚函数地址,一般情况这个数组最后面放了一个

10710

面试必备(背)--Go语言八股文系列!

Context 是并发安全,主要是用于控制多个协程之间协作、取消操作。 4.2 数据结构 Context 只定义了接口,凡是实现接口类都可称为是一种 context。...但是接口实现,值类型接收者和指针类型接收者不一样: 以值类型接收者实现接口,类型本身和该类型指针类型,都实现接口; 以指针类型接收者实现接口,只有对应指针类型才被认为实现接口。...通常我们使用指针作为方法接收者理由: 使用指针方法能够修改接收者指向值。 可以避免在每次调用方法时复制值,在值类型为大型结构体时,这样做会更加高效。 21....接口(interface) 是对非接口值(例如指针,struct等)封装,内部实现包含 2 个字段,类型 T 和 值 V。...也可以看到,内存对齐对实现变量原子性操作也是有好处,每次内存访问是原子,如果变量大小超过字长,那么内存对齐后,对变量访问就是原子,这个特性在并发场景下至关重要。

4K32

泛型基本原理

为什么类型,String 都是父类,不会出现类型匹配问题,于是可以使用 String 进行类型擦除。...那是由于 Java 中数组类型本质上会由虚拟机运行时动态生成一个类型,这个类型除了记录数组必要属性,如长度,元素类型等,会有一个指针指向内存某个位置,这个位置就是数组元素起始位置。...所以子类数组实例赋值父类数组实例,只不过意味着父类数组实例引用指向堆中子类数组而已,并不会有所冲突,因此是 Java 允许这种操作。 而泛型是不允许这么做为什么呢?...我们假设泛型允许这种,看看会有什么问题。...那么,如果允许泛型创建数组,由于数组变性,泛型数组必然也具有变性,而泛型本身又不允许,自然冲突,所以泛型数组也是不允许创建

54100

C++-带你走进多态(1)

(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象指针或者引用,派生类虚函数返回派生类对象指针或者引用时,称为。...有些选择题可能会出,虚函数重写返回值类型不一定相同,就是一个例外。...如果使用基类指针指向一个派生类,就会出现内存泄漏情况,因为派生类析构函数并没有调用。解决方法就是让派生类和基类析构函数完成重写。...普通函数继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承是函数实现。...虚函数继承是一种接口继承,派生类继承是基类虚函数接口,目的是为了重写,达成多态,继承接口。所以如果不实现多态,不要把函数定义成虚函数。 今天分享到这里就结束了,感谢大家阅读!

5010

C++进阶-多态

类虚函数返回基类对象指针或者引用,派生类虚函数返回派生类对象指针或者引用时,称为(基类与派生类虚函数返回值类型不同) 示例: class A {}; class B : public...,建议这样使用 如果基类虚函数不加virtual,派生类虚函数加virtual,这种情况是构成虚函数 析构函数重写 我们知道,基类指针和引用可以指向基类和派生对象,由此通过指针和引用释放对象时需要实现析构多态...: 普通函数继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承是函数实现 虚函数继承是一种接口继承,派生类继承是基类虚函数接口,目的是为了重写,达成多态,继承接口(...对于虚函数类会在对象成员变量中生成虚函数表指针指向虚函数表中储 了对象虚函数地址 对于派生类会继承基类虚函数表,如果派生类重写了虚函数,则会对继承虚函数表中对应函数地址进行覆盖成派生类对象虚函数...菱形继承存在数据冗余和二义性问题 虚继承会让继承父类在成员变量中生成虚基表指针指向虚基表会储存其继承基类成员变量距离其成员变量距离,通过距离找到其基类成员变量,而两个继承父类中虚基表指向同一份父类父类成员变量

56130

【C++】一文简练总结【多态】及其底层原理&具体应用(21)

(因 为继承后基类虚函数被继承下来了在派生类依旧保持虚函数属性),但是种写法不是很规范,建议 这样使用*/ /*void BuyTicket() { cout << "买票-半价" << endl...Person ps; Student st; Func(ps); Func(st); return 0; } 4)虚函数重写两种特殊情况: 【1】:(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时...即如下代码所示:【基类虚函数返回基类对象指针或者引用,派生类虚函数返回派生类对象指针或者引用时】,称为 class A{}; class B : public A {}; class Person...Person析构函数,下面的delete对象调用析构函数, //才能构成多态,才能保证p1和p2指向对象正确调用析构函数。...虚函数继承是一种 接口继承 ,派生类继承是基类虚函数接口, 目的是为了重写,达成多态 ,继承接口。所以如果不实现多态,不要把函数定义成虚函数。

10310

C# 4.0新特性-与逆以及背后编程思想

二、委托中与逆使用 和逆主要体现在两个地方:接口和委托,先来看看在委托中如何使用和逆。...首先定义了一个IPaintable接口,里面定义了一个可读写Color属性,便是实现接口类型对象具有自己颜色,并可以改变颜色。类型Car实现接口。...Brush实现接口。...然后,你再想想为什么用in关键字,而用out关键字。这两个不是偶然,实际上我们可以将/逆与输出/输入匹配起来。 我们再从另一个角度来理解与逆。...我们知道接口代表一种契约,当一个类型实现一个接口时候就相当于签署了这份契约,所以必须是实现接口中所有的成员。实际上类型继承也属于一种契约关系,基类定义契约,子类“签署”契约。

60380

C++进阶:详解多态(多态、虚函数、抽象类以及虚函数原理详解)

)但是种写法规范,大家还是少用为好。...2.2.3虚函数重写两个例外 (基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类虚函数返回值类型不同。...即基类虚函数返回基类对象指针或者引用,派生类虚函数返回派生类对象指针或者引用时,称为 class A { public: virtual A* f() { return new...派生类必须重新实现基类虚函数,并且可以通过多态性实现运行时动态绑定。 这种继承关系强调了对函数接口统一定义,为实现多态提供了基础。...这种动态绑定过程使得程序在运行时能够根据对象实际类型来调用正确虚函数,实现了多态性 为什么多态必须要用基类指针 / 引用来调用虚函数,而用基类对象调用却不行 当派生类对象赋值给基类对象时

26110

金三银四面试:C#.NET面试题中高级篇3,含答案解析

在.NET中,通过Serializable特性提供了序列化对象实例机制,当一个类型被申明为Serializable后,它就能被诸如BinaryFormatter等实现了IFormatter接口类型进行序列化和反序列化...6.在.NET中委托是什么?委托是寻址.NET版本。在C++中,函数指针只不过是一个指向内存位置指针,它不是类型安全。我们无法判断这个指针实际指向什么,像参数和返回类型等久更无从知晓了。...声明一个委托类型,它实例引用一个方法,方法获取一个int参数,返回void。...(Object sender, TEventArgs e)where TEventArgs : EventArgs; 4).使用获取泛型实参和返回值委托时,可利用逆。...逆:父类转换为子类;:子类转换为父类 ---->详解 10. 什么是匿名方法? 匿名方法是用作委托参数一段代码。

1.7K30

C++从入门到精通(第九篇) :多态

virtual关键字时,虽然也可以构成重写(因为继 承后基类虚函数被继承下来了在派生类依旧保持虚函数属性),但是种写法不是很规范,建议这样使用 */ /*void BuyTicket() { cout...: (基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类虚函数返回值类型不同。...即基类虚函数返回基类对象指针或者引 用,派生类虚函数返回派生类对象指针或者引用时,称为。...虚函数 继承是一种接口继承,派生类继承是基类虚函数接口,目的是为了重写,达成多态,继承接口。所 以如果不实现多态,不要把函数定义成虚函数。...对于虚函数类会在对象成员变量中生成虚函数表指针指向虚函数表中储 了对象虚函数地址 对于派生类会继承基类虚函数表,如果派生类重写了虚函数,则会对继承虚函数表中对应函数地址进行覆盖成派生类对象虚函数

43830

第8章 泛型第8章 泛型

在这一点上,泛型跟我们第3章中所讲到“可空类型”实现指针安全,在思想上有着异曲同工之妙。 8.2 在类、接口和函数上使用泛型 泛型类、泛型接口和泛型方法具备可重用性、类型安全和高效等优点。...也就是告诉编译器,类型参数 T 代表都是实现了 Comparable 接口类,这样等于告诉编译器它们都实现了compareTo方法。...与逆可以用下图来简单说明 ? 与逆 和逆都是类型安全。...Java中数组意思可以用下图简单说明 ? Java 数组 Java中泛型是非。如下图所示 ?...现在,我们再看 popAll(Collection dst)方法,方法将Stack中元素依次取出add到dst中,如果不用通配符实现: // popAll method without wildcard

1.9K20

C#基础篇——泛型

为泛型集合类或表示集合中泛型类定义接口通常很有用处。...(2)在子类实现接口中明确给出泛型类型。...T: 类型参数必须是指定基类或派生自指定基类。 T: 类型参数必须是指定接口实现指定接口。可以指定多个接口约束。约束接口也可以是泛型。...可以看到,在泛型接口T前面有一个out关键字修饰,而且T只能是返回值类型,不能作为参数类型,这就是。使用了以后,左边声明是基类,右边可以声明基类或者基类子类。...除了可以用在接口上面,也可以用在委托上面: Func func = new Func(() => null); 除了使用.NET框架定义好以为,我们还可以自定义

1.3K40

【多态】【虚表指针与虚表】【多继承中多态】

4.虚函数重写三个例外 ① ( 基类与派生类虚函数返回值类型不同 ) 派生类重写基类虚函数时候,与基类虚函数返回值类型不同。...即基类虚函数返回基类对象指针或引用,派生类虚函数返回派生类对象指针或引用时,称为。...函数名、返回值类型、参数都必须相同(除外) 两个函数都必须是虚函数 对于 隐藏(重定义) 条件: 两个函数分别在基类和派生类作用域 函数名相同即可 两个基类和派生类同名函数构成重写的话则构成隐藏...2.接口继承和实现继承 普通函数继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承是函数实现。...虚函数继承是一种接口继承,派生类继承是基类虚函数接口,目的是为了重写,达成多态,继承接口。所以如果不实现多态,不要把函数定义成虚函数。 Ⅳ.

1.1K30

【C++】多态

也是虚函数重写特殊情况,三同中返回值可以不同,但是要求返回值必须是一个父子类关系指针或引用,自己父类或其他父类都可以。实际并不常见,大家只要了解一下这个语法就够了。...// 实际中并不常见,这里只要了解一下语法就够了。...虚函数返回值除本身父子类继承关系中类型外,还可以是其他继承关系中父子类指针或引用,例如下面虚函数返回值分别是A *和B *,这也是另一种场景。...,只有某些特殊情景下可能用到 4.析构函数重写也算虚函数重写特殊情况,讲解部分放到下面,这里提前说一下。...多态实现主要通过虚函数重写和虚函数表来实现,当基类指针指向不同类型时,发生多态调用后会去基类指针指向类型里面的虚表去找对应虚函数进行调用,所以多态实现就是依靠虚表和虚函数重写来实现,基类和派生类都有自己虚表

50220
领券