类型已更改,但我认为*(int*)&b
和(int*)*(int*)&b
应指向同一地址。
这是源文件。如果你能帮助我解释为什么A行的两个输出不同,我们将不胜感激。
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef void (*fun)();
class Base
{
public:
virtual void f(){cout<<'f'<<endl;}
virtual void g(){cout<<'g'<<endl;}
virtual void h(){cout<<'h'<<endl;}
};
int _tmain(int argc, _TCHAR* argv[])
{
Base b;
cout<<*(int*)&b<<endl<<(int*)*(int*)&b<<endl; //A
return 0;
}
答案 0 :(得分:0)
忽略代码未定义的事实,区别在于一个表达式是指针而另一个表达式不是。
将Base b;
替换为int b;
,以使其更清晰(并且定义明确)。
然后*(int*)&b
相当于*&b
,即b
,int
。
另一方面,(int*)*(int*)&b
相当于(int*)*&b
,即(int*)b
,int*
。
答案 1 :(得分:0)
首先,您的问题与虚拟功能无关。就不同的输出而言,原因如下:
表达式*(int*)&b
获取对象b
的地址,将其转换为指向整数的指针,然后取消引用它,从而生成一个整数值。
表达式(int*)*(int*)&b
执行上述所有步骤,但它接受整数值并将其转换为整数指针。虽然它具有相同的数值,但它现在是一个指针类型,当使用<<
运算符打印时,它会以十六进制形式显示,而整数值将以十进制形式显示。这就是你看到不同输出的原因。
请注意,您不应该转换某些类的对象以进行打印。如果要使用<<
打印对象,则需要重载该运算符。请查看运算符重载: