关于c++子类继承的this指针的问题

在派生类继承基类的时候,派生类初始化的时候调用基类的构造函数的时候,基类构造函数中的this指针,为什么this指针指向的是派生类的对象,却不能调用派生类的对象b。如下:... 在派生类继承基类的时候,派生类初始化的时候调用基类的构造函数的时候,基类构造函数中的this指针,为什么this指针指向的是派生类的对象,却不能调用派生类的对象b。如下:
#include "stdafx.h"
#include <iostream.h>

class CD{
int d;
public:
CD(){
d=1;
cout<<"CD this ="<<this<<endl;
cout<<"d="<<this->d<<endl;
// cout<<"d="<<this->b<<endl; //报错
}
};

class CB : public CD{
int b;
public:
CB():CD(){
b=2;
cout<<"CB this = "<<this<<endl;
}
};

int main(int argc, char* argv[])
{
CB cb;
return 0;
}

在线等~~~
展开
 我来答
百度网友8adc2ac
推荐于2016-10-04 · TA获得超过1388个赞
知道小有建树答主
回答量:375
采纳率:0%
帮助的人:555万
展开全部
基类指针在程序运行的时候的确指向的是一个派生类的对象,但指针的类型仍然是基类指针。C++是一种强类型语言,因此不能用基类指针类型的指针直接调用派生类;而且,同一个类可能有多种不同的派生类,因此不知道实际指向的会是哪个派生类。
如果确信是某个派生类的话,可以用这样的方法来调用:
((CB*)this)->b = 1;
或者
(dynamic_cast<CB*>(this))->b = 1;
即首先进行一次指针的强制类型转换。
注意如果在构造函数中的话,CB的部分现在还是没有初始化的,因此即使读出b的数据,也不会是2。因为按照C++的标准,构造函数执行的顺序是从基类到派生类。
duck_lwz
2011-10-13 · TA获得超过512个赞
知道小有建树答主
回答量:313
采纳率:0%
帮助的人:337万
展开全部
首先你要明确一点,this指针属于某一具体对象,CB cb定义时,this指针属于cb,可以调用cb的数据和函数成员,CD cd定义时,this指针属于cd,可以调用cd的数据和函数成员。

CD(){
d=1;
cout<<"CD this ="<<this<<endl;
cout<<"d="<<this->d<<endl;
// cout<<"d="<<this->b<<endl; //报错
}
注释掉的这行代码会报错,是因为构造函数中的this是指向基类对象的,基类对象中没有b这个数据成员。
更多追问追答
追问
您这个MFC学的很明白?
追答
这就是一普通程序,和MFC没有关系。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
屿浪2ae1
2011-10-13 · TA获得超过848个赞
知道答主
回答量:103
采纳率:0%
帮助的人:67.4万
展开全部
// cout<<"d="<<this->b<<endl;
我想应该是初始化顺序吧
首先 CB类 初始化 基类 CD,这时候还并不知道派生类的 b ,所以会报错
初始完基类以后才会初始化自己,这个时候才会有成员 b
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
fairy48277901
2011-10-13
知道答主
回答量:17
采纳率:0%
帮助的人:11.1万
展开全部
因为基类是实类,所以在调用的时候会使用基类成员
将基类和需要派生的成员定义为virtual类型就可以了
这就是C++中关于多态的一种表现
追问
不是啦 我是问为什么this指针指向的是派生类的对象,却不能调用派生类的对象b。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
02456kw
2011-10-13 · 超过16用户采纳过TA的回答
知道答主
回答量:49
采纳率:0%
帮助的人:52万
展开全部
看不明白你的问题 在CB():CD(){ b=2;this->b}这样不行吗
追问
vvv
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式