函数形参为基类数组,实参为继承类数组,下存在的问题------c++程序设计原理与实践(进阶篇)
发布日期:2022-04-04 06:36:23
浏览次数:18
分类:博客文章
本文共 934 字,大约阅读时间需要 3 分钟。
示例:
#includeusing namespace std;class A { public: int a; int b; A(int aa=1, int bb=2):a(aa),b(bb) {}};class B :public A { public: B(int a=3,int b=4,int c=5,int d=6):A(a,b),d(c),g(d) {} int d; int g; };void f(A* p,int n) { for (int i = 0; i < n;i++)cout << p[i].a<<" "; }int main() { A a1[50]; B b1[50]; f(a1, 50); cout << endl; f(b1, 50);}
输出结果:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 13 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5
问题出现在&b1[0]是一个B*指针。f()期待的是一个A*指针,而我们传递给它的是一个A派生类对象指针(B*)。这显然是允许的。但是f()不仅仅把A*作为一个指针类使用,还将它作为数组来使用,通过下标访问其元素:
for (int i = 0; i < n;i++)cout << p[i].a<<" ";
这段代码顺序访问内存地址&p[0]、&p[1]、&p[2]···上的对象:
就内存地址而言,这些指针的间距为sizeof(A)。但不幸的是,对于此次f()的调用,sizeof(B)大于sizeof(A),因此内存布局如下所示:
也就是说,f()中指针实际指向的是B对象的中间!刚好B是4个int,A是2个int。所以才有上述的输出。如果不是刚好,这很可能导致程序崩溃。
c++程序设计原理与实践(进阶篇)
转载地址:https://www.cnblogs.com/l2017/p/7868923.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月02日 13时30分56秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MySQL的行锁、表锁、间隙锁详解
2019-04-27
和阿里面试官扯了半小时ArrayBlockingQueue源码
2019-04-27
远离996,PDMan开源免费的国产数据库建模工具!
2019-04-27
现代操作系统的存储器结构
2019-04-27
深度揭秘年薪60W的阿里P7简历制作过程!
2019-04-27
可能是全网最全的SpringBoot启动流程源码分析(基于 2.1.5 版本)
2019-04-27
BAT华为等一线大厂工程师都在用的优秀 IDEA 插件
2019-04-27
屏幕录制和编辑神器ScreenFlow轻松上手
2019-04-27
防止Java序列化/反射破坏单例模式的解决方案
2019-04-27
面试/工作必备的vim基础及快捷键操作
2019-04-27
@SpringBootApplication注解到底做了什么,你真的了解吗?
2019-04-27
Java生态中性能最强数据库连接池HikariCP
2019-04-27
图文+代码带你攻克OAuth 2.0三大核心授权类型
2019-04-27
Oracle中wm_concat的使用
2019-04-27
国庆第四天出行归来
2019-04-27
宝宝游乐园的优化思路(r6笔记第72天)
2019-04-27
UI5_INFO_FETCH_FROM_DB
2019-04-27
SAP CRM WebClient UI的配置存储数据库表
2019-04-27
SAP Commerce(原Hybris)的一些架构图,持续更新
2019-04-27