由vector造成的对象切片问题

news/2024/7/4 0:53:08 标签: vector, iterator, class, insert, 编译器, object
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

 由class="tags" href="/tags/VECTOR.html" title=vector>vector造成的对象切片

在编写一个小实例的时候,发现用class="tags" href="/tags/VECTOR.html" title=vector>vector存放基类,而试图调用子类的虚函数是行不通的!代码如下:

 

这样的结果是我当初的构想完全不一样的,那么为什么会造成这种现象呢?

先从对象大小的角度来看:

由于声明的是class="tags" href="/tags/VECTOR.html" title=vector>vector<base>,那么每个元素的大小就是sizeof(base),如果转入的是子类,那实际上进入class="tags" href="/tags/VECTOR.html" title=vector>vector的“合法”大小也仅为sizeof(base),超过这部分的大小,将被忽略,这就是对象切片(Object Slicing)。

再从虚函数表的角度来看:

我们知道,C++实现多态的原理就是利用了虚函数表,每个对象在定义后的头4个字节就是一个指向虚函数表的指针(而虚函数表则是每个类共享一份),这是在编译器就确定的,在运行时再通过虚函数表的指针找到真正的实现函数的首地址。那么心细的朋友可能发现了,代码:
    v1.push_back( child() ); 

明明定义了一个child对象,也就是在临时对象中的虚函数表指针是指向child的show函数的,那么放入v1的对象也应该是拥有指向child的虚函数表指针的吧?

答案是否定的,我们来看push_back的代码(GCC):

就是说,其实在class="tags" href="/tags/VECTOR.html" title=vector>vector中存放的已经是彻底的base了。。。

因此通过声明class="tags" href="/tags/VECTOR.html" title=vector>vector<base>来实现多态是不行的。

那么如果才能通过class="tags" href="/tags/VECTOR.html" title=vector>vector来实现多态呢?

可以用存放指针的方法:class="tags" href="/tags/VECTOR.html" title=vector>vector<base*>  示例代码如下:

当然在实际项目中用智能指针会是更好的选择!


http://www.niftyadmin.cn/n/645235.html

相关文章

c#里压缩文件的两种方式

c#里一般可以使用两种方式来压缩文件&#xff0c;第一种为使用GZipStream类&#xff0c;这个类是MS提供的&#xff1b;第二种为使用SharpZipLib库&#xff0c;这个类非MS官方提供&#xff0c;但被大家广泛使用。下面分别给出这两种压缩文件方式的简单实现代码&#xff1a; 1、使…

如何复制一个函数

复制一个函数的每个字节&#xff0c;char数组也能成为函数 代码如下&#xff1a; #include <stdio.h>int add(int _x,int _y){return _x _y;}int main(void){unsigned char buff[255] {0};unsigned char* pBuffHead buff;unsigned char* pFun (unsigned char*)(&…

C# 3.03值类型

C# 3.03值类型 float theMySum 9.27f; float theMuSums 1.12F; double myDou 927d; double mudou 112D; 如果9.27后面没有加上f,默认是double类型 如果定义了float类型的变量&#xff0c;没有赋值。默认是0&#xff0c;不是0.00

c#里string和byte[]相互转换

string类型转成byte[]&#xff1a; byte[] byteArray System.Text.Encoding.Default.GetBytes ( str );反过来&#xff0c;byte[]转成string&#xff1a;string str System.Text.Encoding.Default.GetString ( byteArray );其它编码方式的&#xff0c;如System.Text.UTF8Enco…

C++的10种境界 看看你处于第几级

0 级&#xff1a;简历上写着了解c, 实际上不知道mfc和VC有什么区别。 1 级&#xff1a;简历上写着精通c, 但是仅仅知道mfc, 认为VC就是C的一切。 2 级&#xff1a;总是使用malloc&#xff0c;或者 char[100] 来获得内存&#xff0c;但不知道怎么在指定内存上面创建对象。 …

C# 使用sharpziplib写的一个可以压缩和解压缩文件夹的类

/// <summary>/// 自定义读取流&#xff08;只读&#xff09;/// </summary>internal class CusStreamReader : Stream{long _endPosition;//结束位置Stream innerStream;/// <summary>/// 参数为当前流的断点/// </summary>public event Action<lo…

华硕asus k013 me176cx rom固件刷机包

华硕asus k013 me176cx rom固件刷机包 2个ROM&#xff0c;地址是&#xff1a;http://dlcdnet.asus.com/pub/ASUS/EeePAD/ME176C/ME176C-CN-3_2_23_182.ziphttp://dlcdnet.asus.com/pub/ASUS/EeePAD/ME176C/ME176C-WW-3_2_23_182.zip https://tieba.baidu.com/p/4115938258 ht…