一个困惑的问题

smilenot 2011-06-20 10:13:05

#include <iostream>
using namespace std;
class A
{
public:
int a;
A *pa;
public:
virtual void dosomething(){cout << "A类dosomething"<<endl;}
A()
{
cout << "A类构造"<<endl;
pa = this;
a = 1;
}
virtual ~A(){cout << "A类析构"<<endl;}
};
class B : public A
{
public:
int b;
B *pb;
public:
void dosomething(){cout << "B类dosomething"<<endl;}
void dosomethings(){cout << "B类dosomethings"<<endl;}
B()
{
cout << "B类构造"<<endl;
b = 2;
pb = this;

}
~B(){cout << "B类析构"<<endl;}
};
int main()
{
A a;
B b;

cout << a.pa << endl; // 输出1结果: 0012FF68
cout << b.pa << endl; // 输出2结果: 0012FF54
cout << b.pb << endl; // 输出3结果: 0012FF54
return 0;
}

为什么输出2的结果与输出3的结果是一样的,我觉得应该是和输出1 的结果是样的,因为A类中的pa指针指向的是A的对象,这个pa的值不会在B类中发生改变,如果我将A类的this指针换成一个数字:比如0X0012FF68,则输出2和输出1是一样的
为什么会有这现象,我哪里理解错了
...全文
140 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwer_boo 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]

b中也会有pa,b初始化时,那个this是b,不是a
[/Quote]
至善者善之敌 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 smilenot 的回复:]
引用 2 楼 dizuo 的回复:
构造B的时候先构造A,基类是派生类的一部分,且内存分布上位于头部。所以2,3输出地址一样

我想知道这个时候内存中有几个类对象,有一个类A 的对象a,一个类B的对象b ,是不是还有其他的什么对象?
B在创建对象的时候会不会也创建一个A的对象,于是内存中有3个对象?是这样吗
[/Quote]
一旦公有继承,你就可以理解为A,B是一个类这样THIS指向就只能是一个,他就是B
就想叫yoko 2011-06-20
  • 打赏
  • 举报
回复
B b;
只会产生一个B类对象 this就是指向这个对象的
smilenot 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dizuo 的回复:]
构造B的时候先构造A,基类是派生类的一部分,且内存分布上位于头部。所以2,3输出地址一样
[/Quote]
我想知道这个时候内存中有几个类对象,有一个类A 的对象a,一个类B的对象b ,是不是还有其他的什么对象?
B在创建对象的时候会不会也创建一个A的对象,于是内存中有3个对象?是这样吗
ryfdizuo 2011-06-20
  • 打赏
  • 举报
回复
构造B的时候先构造A,基类是派生类的一部分,且内存分布上位于头部。所以2,3输出地址一样
bdmh 2011-06-20
  • 打赏
  • 举报
回复
b中也会有pa,b初始化时,那个this是b,不是a
不辣 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dizuo 的回复:]
构造B的时候先构造A,基类是派生类的一部分,且内存分布上位于头部。所以2,3输出地址一样
[/Quote]

同意。

64,645

社区成员

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

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