读《深度探索C++对象模型》(简体版)的两个疑问
读《深度探索C++对象模型》(简体版)的两个疑问
疑问一:
p.105讲述了继承对象的布局为什么不紧凑(即除去多余的填补空间),书上说是因为要防止在进行对象赋值间时出现意外。但是我搞不清书上的例子为什么会产生意外,以书上的例子来说:
Concrete2 *pc2;
Concrete1 *pc1_1,*pc1_2;
pc1_1 = pc2; //pc1_1指向Concrete2对象
*pc1_2=*pc1_1; //将Concrete2赋给Concrete1
若采取紧凑的布局,则布局应该这样:
_____________ ____________
| | | |
| int 4 | | int 4 |
|----------| |----------|
| char 1 | | char 1 |
|----------| |----------|
| | | char 1 |
| padding | |----------|
| 3 | | padding2 |
|__________| |__________|
Concrete1 Concrete2
但此时将Concrete2赋给Concrete1并不会发生任何问题啊,只会将Concrete1的一个padding字节用Concrete2的下面一个char覆盖,除非把Concrete1赋给Concrete2才会将Concrete2下面的一个char用未知数据填充,造成书上所说的情况。这样的话书上例子就应该改成:
Concrete2 *pc2;
Concrete1 *pc1_1,*pc1_2;
pc1_1 = pc2; //pc1_1指向Concrete2对象
*pc1_1=*pc1_2; //将Concrete1赋给Concrete2(改)
~~~ ~~~ ~~ ~~
不知道我想的对不对。
疑问二:
p.148讲述的是static member functions(静态成员函数)的由来,作者说是要便于存取static members(静态成员变量),但是static members不是可以直接用“::”存取吗,干吗还要static member functions呢?