C++编程中的细节--内容覆盖
![]() | ![]() | |
![]() | 一个简单的示例来讲解下这个问题。 [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 以后写程序的时候还真得注意这些小细节。 | |
![]() | ![]() |