比如有三个类,它们的关系如下:
class MyClassA
{
public:
virtual ~MyClassA(void){}
};class MyClassB
{
public:
virtual ~MyClassB(void){}
};class MyClassC
: public MyClassA
, public MyClassB
{
};MyClassC c;
MyClassA *pa = &c;
MyClassB *pb = &c;
MyClassC *pc = &c;此时, 我在VC里跟踪时, pa == pc, pb != pc
有没办法通过pb来获取对象的实际地址, 即pc,当基类有虚析构函数时, 通过基类的指针删除派生类能正常清理对象,
说明通过pb应该能得到pb指向的对象其实是一个MyClassC,至少编译器有办法知道
不知道通过程序能不能判断出来,pb指向的实际对象
class MyClassA
{
public:
virtual ~MyClassA(void){}
};class MyClassB
{
public:
virtual ~MyClassB(void){}
};class MyClassC
: public MyClassA
, public MyClassB
{
};MyClassC c;
MyClassA *pa = &c;
MyClassB *pb = &c;
MyClassC *pc = &c;此时, 我在VC里跟踪时, pa == pc, pb != pc
有没办法通过pb来获取对象的实际地址, 即pc,当基类有虚析构函数时, 通过基类的指针删除派生类能正常清理对象,
说明通过pb应该能得到pb指向的对象其实是一个MyClassC,至少编译器有办法知道
不知道通过程序能不能判断出来,pb指向的实际对象
解决方案 »
- 我用classwizard add new class,为什么总是不行呢?
- 如何为对话框应用程序添加状态栏?
- 请问怎么用WritePrivateProfileString向ini文件中写入中文,我怎么写不进?
- 有关串口的问题
- 哪里有国际象棋的源程序?
- 学VC好啊!
- 请问怎样通过编程来遍历一个控件的所有属性名称与其值?
- 能否根据CLSID和相关的DLL创建快捷方式?
- 收藏 不显示删除回复显示所有回复显示星级回复显示得分回复 怎样实现在一个Dialog中,单击button调用onpaint画图(在Dialog其他位置),怎么没
- 我们拿什么打败微软!?
- 有点烦 c 的 // ;,难道c的编译就不能再聪明点吗?
- 请教下word插入图片时的尺寸问题
我只想通过pb的指针得到pb指向的对象的实际地址(即内存中对象模型的起始地址pc)
pa,pb,pc是三个不同的指针变量,都会有自己的地址,相等的应该是他们的变量值吧:
*pa=*pc。
*pa 怎么会等于 *pc, 一个是MyClassA的引用, 一个是MyClassC的引用,
不同类型的没实现==号操作咋比较呢。
的确是pa == pc,两个指针相等。
sizeof(*pc)=sizeof(*pa)+sizeof(*pb);
要想通过pb得到 实际地址 只要 pb 减去 pa 的大小就行了,不过要把指针先转换成int格式才行。using namespace std;
class MyClassA
{
public:
virtual ~MyClassA(void){}
};class MyClassB
{
public:
virtual ~MyClassB(void){}
};class MyClassC: public MyClassA, public MyClassB
{
};
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
MyClassC c;
MyClassA *pa = &c;
MyClassB *pb = &c;
MyClassC *pc = &c;
cout<<"pa:"<<pa<<" "<<sizeof(MyClassA)<<endl;
cout<<"pb:"<<pb<<" "<<sizeof(MyClassB)<<endl;
cout<<"pc:"<<pc<<" "<<sizeof(MyClassC)<<endl;
int ppb=(int)pb;
ppb-=sizeof(MyClassA);
cout<<"现在pb转换后的地址 "<<(int * )ppb<<endl;
return 0;
}
那样用dynamic_cast之类的就搞定了。俺的情况是pa不确定是指向一个MyClassA还是MyClassC
要在运行时判断。