关于虚函数,为什么*(int *)& b和(int *)*(int *)& b的打印值不同?

时间:2016-04-17 06:53:27

标签: c++ pointers virtual-functions

类型已更改,但我认为*(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;
}

2 个答案:

答案 0 :(得分:0)

忽略代码未定义的事实,区别在于一个表达式是指针而另一个表达式不是。

Base b;替换为int b;,以使其更清晰(并且定义明确)。

然后*(int*)&b相当于*&b,即bint。 另一方面,(int*)*(int*)&b相当于(int*)*&b,即(int*)bint*

答案 1 :(得分:0)

首先,您的问题与虚拟功能无关。就不同的输出而言,原因如下:

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

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

  3. 请注意,您不应该转换某些类的对象以进行打印。如果要使用<<打印对象,则需要重载该运算符。请查看运算符重载

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