goback add

C++编程中的细节--内容覆盖

4615 点击·0 回帖
灯火互联
楼主

    一个简单的示例来讲解下这个问题。

[cpp]

class Concrete

{

public:

private:

    int val;

    char c1;

    char c2;

    char c3;

};

 

class Concrete1

{

    public:

    int val;

    char bit1;

};

class Concrete2 :public Concrete1

{

    public:

    char bit2;

};

 

class Concrete3 :public Concrete2

{

    public:

    char bit3;

};

 

 

int main()

{

    Concrete2 *pc2;

    pc2->val = 10;

    pc2->bit1 = 'a';

    pc2->bit2 = 'b';

    Concrete1 * pc1_1, *pc1_2;

    pc1_1 = pc2;

    *pc1_2 = *pc1_1;

 

    cout<< pc2->bit2<<endl;

    return 0;

}

本来bit2的值是b,但是通过赋值后 bit2的内容被pc1_1指向的对象中为分配的内存内容覆盖了(因为编译器有个内存对齐的操作,也就是上面的三个类的大小分别是8bytes,12bytes,16bytes)还是贴张图吧。

图片:20121015112300163.png

当经过这个操作:

[cpp]

pc1_1 = pc2;

*pc1_2 = *pc1_1;

对象pc1_1中未分配的内容就复制给了pc1_2指向的对象。

图片:20121015112304213.png

以后写程序的时候还真得注意这些小细节。


喜欢0 评分0