一個簡單的示例來講解下這個問題。
[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)還是貼張圖吧。
當經過這個操作:
[cpp]
pc1_1 = pc2;
*pc1_2 = *pc1_1;
對象pc1_1中未分配的內容就復制給了pc1_2指向的對象。
以後寫程序的時候還真得注意這些小細節。