读《深度探索C++对象模型》(简体版)的两个疑问

boodweb boodweb 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
读《深度探索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呢?
...全文
评论 20
收藏 已收藏
分享
返回顶部
boodweb
C语言 70,039 成员 243,237 内容