zoukankan      html  css  js  c++  java
  • 函数形参为基类数组,实参为继承类数组,下存在的问题------c++程序设计原理与实践(进阶篇)

      示例:

    #include<iostream>
    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 1
    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 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++程序设计原理与实践(进阶篇)

  • 相关阅读:
    ThinkingInJava对this关键字的介绍
    MYSQL(三)
    MySQL(二)
    mysql语句实战
    js事件委托
    Python中应该使用%还是format来格式化字符串?
    js高级知识---词法分析和AO 链
    lsof/netstat命令的一个重要作用: 根据进程查端口, 根据端口查进程
    gg
    io多路复用
  • 原文地址:https://www.cnblogs.com/l2017/p/7868923.html
Copyright © 2011-2022 走看看