
关于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;
}
在线等~~~ 展开
#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;
}
在线等~~~ 展开
展开全部
基类指针在程序运行的时候的确指向的是一个派生类的对象,但指针的类型仍然是基类指针。C++是一种强类型语言,因此不能用基类指针类型的指针直接调用派生类;而且,同一个类可能有多种不同的派生类,因此不知道实际指向的会是哪个派生类。
如果确信是某个派生类的话,可以用这样的方法来调用:
((CB*)this)->b = 1;
或者
(dynamic_cast<CB*>(this))->b = 1;
即首先进行一次指针的强制类型转换。
注意如果在构造函数中的话,CB的部分现在还是没有初始化的,因此即使读出b的数据,也不会是2。因为按照C++的标准,构造函数执行的顺序是从基类到派生类。
如果确信是某个派生类的话,可以用这样的方法来调用:
((CB*)this)->b = 1;
或者
(dynamic_cast<CB*>(this))->b = 1;
即首先进行一次指针的强制类型转换。
注意如果在构造函数中的话,CB的部分现在还是没有初始化的,因此即使读出b的数据,也不会是2。因为按照C++的标准,构造函数执行的顺序是从基类到派生类。
展开全部
首先你要明确一点,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这个数据成员。
CD(){
d=1;
cout<<"CD this ="<<this<<endl;
cout<<"d="<<this->d<<endl;
// cout<<"d="<<this->b<<endl; //报错
}
注释掉的这行代码会报错,是因为构造函数中的this是指向基类对象的,基类对象中没有b这个数据成员。
更多追问追答
追问
您这个MFC学的很明白?
追答
这就是一普通程序,和MFC没有关系。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
// cout<<"d="<<this->b<<endl;
我想应该是初始化顺序吧
首先 CB类 初始化 基类 CD,这时候还并不知道派生类的 b ,所以会报错
初始完基类以后才会初始化自己,这个时候才会有成员 b
我想应该是初始化顺序吧
首先 CB类 初始化 基类 CD,这时候还并不知道派生类的 b ,所以会报错
初始完基类以后才会初始化自己,这个时候才会有成员 b
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为基类是实类,所以在调用的时候会使用基类成员
将基类和需要派生的成员定义为virtual类型就可以了
这就是C++中关于多态的一种表现
将基类和需要派生的成员定义为virtual类型就可以了
这就是C++中关于多态的一种表现
追问
不是啦 我是问为什么this指针指向的是派生类的对象,却不能调用派生类的对象b。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看不明白你的问题 在CB():CD(){ b=2;this->b}这样不行吗
追问
vvv
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询