《深度探索C++对象模型》中的一个异常
《深度探索C++对象模型》中的一个错误
class Base1
{
//....
protected:
float data_Base1;
}
class Base2
{
//....
protected:
float data_Base2;
}
class Derived : public Base1, public Base2
{
//....
protected:
float data_Derived;
}
书上说,对于下面的语句:
Base2* pBase2 = new Derived;
编译时期,会将Derived对象的地址进行下面的调整,以使其指向其Base2:
Derived* temp = new Derived;
Base2* pBase2 = temp ? temp + sizeof(Base1) : 0;
问题是,开始以为temp + sizeof(Base1)是Derived的起始地址加上Base1的大小(4个字节),得到Base2的地址。
但是在VC上实验得到temp + sizeof(Base1)并不是Base2的地址:VC上temp加上4的意思是temp + 4 * sizeof(Derived),
也就是temp是Derived*类型的指针,所以temp加上4就是要加上4个Derived类型的大小。是书上错了吗?如何能够计算出
Base2的地址呢?
------解决方案--------------------
你无读好书,也没有理解好这本书。
这本书和VC两者都是正确的!lippmen早在书的开头就已经提示类对象模型及其实现并无标准化,他在书中所阐述的只是模型的可能实现方法,而非一定或者必须这样做!!
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
对于正规编程,这东西还真就没用
搞crack的还可以稍微研究下。
------解决方案--------------------
这帖子上首页了
class Base1
{
//....
protected:
float data_Base1;
}
class Base2
{
//....
protected:
float data_Base2;
}
class Derived : public Base1, public Base2
{
//....
protected:
float data_Derived;
}
书上说,对于下面的语句:
Base2* pBase2 = new Derived;
编译时期,会将Derived对象的地址进行下面的调整,以使其指向其Base2:
Derived* temp = new Derived;
Base2* pBase2 = temp ? temp + sizeof(Base1) : 0;
问题是,开始以为temp + sizeof(Base1)是Derived的起始地址加上Base1的大小(4个字节),得到Base2的地址。
但是在VC上实验得到temp + sizeof(Base1)并不是Base2的地址:VC上temp加上4的意思是temp + 4 * sizeof(Derived),
也就是temp是Derived*类型的指针,所以temp加上4就是要加上4个Derived类型的大小。是书上错了吗?如何能够计算出
Base2的地址呢?
------解决方案--------------------
你无读好书,也没有理解好这本书。
这本书和VC两者都是正确的!lippmen早在书的开头就已经提示类对象模型及其实现并无标准化,他在书中所阐述的只是模型的可能实现方法,而非一定或者必须这样做!!
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
对于正规编程,这东西还真就没用
搞crack的还可以稍微研究下。
------解决方案--------------------
这帖子上首页了