关于虚函数,为什么 *(int*)&b 和 (int*)*(int*)&b 的打印值不同?
About virtual functions, why are printed values of *(int*)&b and (int*)*(int*)&b different?
类型已更改,但我认为 *(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;
}
尽管您的代码未定义,区别在于一个表达式是指针而另一个不是。
将 Base b;
替换为 int b;
以使其更清晰(并且定义明确)。
那么*(int*)&b
相当于*&b
,也就是b
,一个int
.
另一方面,(int*)*(int*)&b
等同于 (int*)*&b
,即 (int*)b
,一个 int*
.
首先,你的问题与虚函数没有任何关系。至于不同的输出,原因如下:
表达式*(int*)&b
获取对象b
的地址,将其转换为指向整数的指针,然后取消引用它,从而产生一个整数值。
表达式 (int*)*(int*)&b
执行上述所有步骤,但它随后获取该整数值并将其转换为整数指针。虽然它具有相同的数值,但它现在是指针类型,这导致它在使用 <<
运算符打印时以十六进制形式显示,而整数值将以十进制形式显示。这就是您看到不同输出的原因。
请注意,您不应该为了打印某些 class 的对象而进行转换。如果要使用 <<
打印对象,则需要重载该运算符。请看一下运算符重载:
类型已更改,但我认为 *(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;
}
尽管您的代码未定义,区别在于一个表达式是指针而另一个不是。
将 Base b;
替换为 int b;
以使其更清晰(并且定义明确)。
那么*(int*)&b
相当于*&b
,也就是b
,一个int
.
另一方面,(int*)*(int*)&b
等同于 (int*)*&b
,即 (int*)b
,一个 int*
.
首先,你的问题与虚函数没有任何关系。至于不同的输出,原因如下:
表达式
*(int*)&b
获取对象b
的地址,将其转换为指向整数的指针,然后取消引用它,从而产生一个整数值。表达式
(int*)*(int*)&b
执行上述所有步骤,但它随后获取该整数值并将其转换为整数指针。虽然它具有相同的数值,但它现在是指针类型,这导致它在使用<<
运算符打印时以十六进制形式显示,而整数值将以十进制形式显示。这就是您看到不同输出的原因。
请注意,您不应该为了打印某些 class 的对象而进行转换。如果要使用 <<
打印对象,则需要重载该运算符。请看一下运算符重载: