求解:关于effective C++条款27中单一对象可能拥有多个地址

qq_33400592 2018-06-10 08:28:50
最近在看effective C++,碰到了一些不懂的地方,还希望各位高手解惑
class Base{...};
class Derived: public Base{...};
Derived d;
Base* pb = &d;
这里我们不过是建立一个base class 指针指向一个derived class对象,但有时候上述两个指针的值并不同。在这种情况下会有个偏移量在运行期被施行于Dervied*指针身上,用已取得正确的Base*指针。
上述例子表明,单一对象(例如一个类型为Derived的对象)可能拥有一个以上的地址(例如以Base*指向它时的地址和以Derived*指向它时的地址)


这里没看懂。。。自己在VS上跑了一下,发现用父类指针指向子类时候父类指针的地址和子类是一样的。。希望望各位大牛解惑
...全文
611 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-06-12
  • 打赏
  • 举报
回复
《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》
书香门第 2018-06-12
  • 打赏
  • 举报
回复
引用 3 楼 qq_33400592 的回复:
[quote=引用 1 楼 weixin_42325834 的回复:] 我的理解是必须要进行静态类型转换才能出现同一个对象的指针不同的情况,比如:
class Base {
private: 
	int i; 
};

class Derived : public Base {
private:
	int j; 
};

void f1(Base b) {
	cout << &b << endl; 
}

void f2(Derived d) {
	cout << &d << endl; 
}

int main()
{
	Derived d; 
	Base *pb = &d; 

	Derived *pd = &d; 


	f1(d); 
	f2(d); 


	return 0;
}
这样传入f1或者f2的实际上是一个临时对象吧,程序中输出的应该是临时对象的地址。。在主程序调用f1和f2之前先输出d的地址会发现三者的地址都是不同的。。。 如果把f函数的参数改成引用的话二者地址都是相同的了。。[/quote] 多谢指正!你说的是对的,我犯了一个很愚蠢的错误。下面的代码可以说明指向一个instance的不同指针会有不同的地址的情况:
class B1
{
	int i;
};

class B2
{
	int i;
};

class D : public B1, public B2
{
	int i;
};

int
main()
{
	D aD;

	D* pD = &aD; 
	B2* pB2 = &aD; 

	cout << pD << endl; 
	cout << pB2 << endl; 

	return 0;
}
donjin9 2018-06-11
  • 打赏
  • 举报
回复
它的意思可能是,基类的数据没规定一定要放在子类的首地址,各编译器自己决定。 另外,多继承和虚继承就特别明显。
书香门第 2018-06-11
  • 打赏
  • 举报
回复
我的理解是必须要进行静态类型转换才能出现同一个对象的指针不同的情况,比如:
class Base {
private: 
	int i; 
};

class Derived : public Base {
private:
	int j; 
};

void f1(Base b) {
	cout << &b << endl; 
}

void f2(Derived d) {
	cout << &d << endl; 
}

int main()
{
	Derived d; 
	Base *pb = &d; 

	Derived *pd = &d; 


	f1(d); 
	f2(d); 


	return 0;
}
qq_33400592 2018-06-11
  • 打赏
  • 举报
回复
引用 1 楼 weixin_42325834 的回复:
我的理解是必须要进行静态类型转换才能出现同一个对象的指针不同的情况,比如:
class Base {
private: 
	int i; 
};

class Derived : public Base {
private:
	int j; 
};

void f1(Base b) {
	cout << &b << endl; 
}

void f2(Derived d) {
	cout << &d << endl; 
}

int main()
{
	Derived d; 
	Base *pb = &d; 

	Derived *pd = &d; 


	f1(d); 
	f2(d); 


	return 0;
}
这样传入f1或者f2的实际上是一个临时对象吧,程序中输出的应该是临时对象的地址。。在主程序调用f1和f2之前先输出d的地址会发现三者的地址都是不同的。。。 如果把f函数的参数改成引用的话二者地址都是相同的了。。

65,176

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧