函数形参为基类数组,实参为继承类数组,下存在的问题------c++程序设计原理与实践(进阶篇)
发布日期:2022-04-04 06:36:23 浏览次数:18 分类:博客文章

本文共 934 字,大约阅读时间需要 3 分钟。

  示例:

#include
using 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:函数返回值string与返回值bool区别------c++程序设计原理与实践(进阶篇)
下一篇:bitest(位集合)------c++程序设计原理与实践(进阶篇)

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月02日 13时30分56秒