暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C++多态的方式处理数组要注意了~

嵌入式情报局 2021-08-15
916
大家好,我是情报小哥!

01

对象数组

前面的文章小哥跟大家介绍了多态,其中虚函数是实现面向对象多态的非常重要的手段,而虚函数简单的理解就是通过父类指针可以直接访问到子类的同名虚函数,这样从方法绑定类型过渡到了方法绑定对象,所以这也就是为什么叫面向对象吧。

而对于数组是我们玩C语言最早接触的数据类型,它的特点就是同类型数据的连续存储的集合,而在C++中所有的数据类型大伙都要他们看成是类类型。

基于这样的观点,我们的数组类型当然可以是对象,再简单一点理解就类似于C语言中的元素类型为结构体的数组,下面我们看一下对象数组:

1#include <iostream>
2using namespace std;
3
4class Array
5
{
6public:
7    int Val;
8
9public:
10    Array(int a):Val(a)
11    {
12
13    }
14    void print(void)
15    {
16        cout<<"print : "<< Val<<endl; 
17    } 
18};
19
20int main(int argc, char** argv) {
21
22    Array  array[5] ={1,2,3,4,5};
23
24    for(int i = 0;i < 5;i++)
25    {
26        array[i].print();
27    }
28    return 0;
29}

最后输出的结果为:

使用方法跟结构体是极为的相似,所以小哥一直觉得C++确实就是加强版本的C,C+面向对象的属性就成为C++,所以所谓的class仅仅只是struct一种升级版本罢了~

02

对象数组为啥不用多态

其实这句结论性的话说还不是那么严谨,主要是建议大家尽量不要用父类指针去遍历子类的数组。
其实对于C语言玩得不错的伙计,这块很容易理解,因为父类指针的索引是根据"父类指针地址+N*sizeof(父类类型)",那么我们回顾一下虚函数通过虚函数表就是为了让处理方法不与对象的类型进行绑定,而是动态的跟对象直接绑定,而父类指针去访问子类数组,却有把父类类型引入了,这样就有了一丝矛盾,子类和父类的类型内存大小一旦不相等,就会存在访问上的错误。


所以如果你在父类中并没有通过父类指针去遍历和索引,那也是没有问题的,多态还是可以继续使用的,如果需要使用父类指针去索引子类对象数组,那就特别需要注意内存对齐问题了~

最  后 


这里小哥就介绍了一下C++中多态在数组中使用的注意事项,希望本文能够对你有帮助,该系列还会持续更新,大家可以持续关注~

小哥搜集了一些嵌入式学习资料,公众号内回复"1024"即可获取~

推荐好文  点击蓝色字体即可跳转


☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

专辑|从单片机到Linux

☞ 专辑|电能控制技术

文章转载自嵌入式情报局,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论