关于虚函数,为什么 *(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*.

首先,你的问题与虚函数没有任何关系。至于不同的输出,原因如下:

  1. 表达式*(int*)&b获取对象b的地址,将其转换为指向整数的指针,然后取消引用它,从而产生一个整数值。

  2. 表达式 (int*)*(int*)&b 执行上述所有步骤,但它随后获取该整数值并将其转换为整数指针。虽然它具有相同的数值,但它现在是指针类型,这导致它在使用 << 运算符打印时以十六进制形式显示,而整数值将以十进制形式显示。这就是您看到不同输出的原因。

请注意,您不应该为了打印某些 class 的对象而进行转换。如果要使用 << 打印对象,则需要重载该运算符。请看一下运算符重载:

http://en.cppreference.com/w/cpp/language/operators