【问题标题】:About virtual functions, why are printed values of *(int*)&b and (int*)*(int*)&b different?关于虚函数,为什么 *(int*)&b 和 (int*)*(int*)&b 的打印值不同?
【发布时间】:2016-04-17 06:53:26
【问题描述】:

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

【问题讨论】:

  • 请查看我的答案以获得有关不同输出的更详细说明。

标签: c++ pointers virtual-functions


【解决方案1】:

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

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

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

请注意,您不应该为了打印它而转换某个类的对象。如果要使用&lt;&lt; 打印对象,则需要重载该运算符。请看一下运算符重载

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

【讨论】:

  • 我明白了。我只是想得到第一个虚函数的地址......无论如何我认为你已经给了我一个完美的答案。非常感谢。
  • @PandaLee 欢迎您!如果您认为答案很好,请考虑将其标记为已接受,以感谢我的时间和努力。祝您学习更多 C++ 好运。
【解决方案2】:

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

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

那么*(int*)&amp;b等价于*&amp;b,也就是b,一个int
另一方面,(int*)*(int*)&amp;b 等价于(int*)*&amp;b,即(int*)b,即int*

【讨论】:

  • 但是我不能cout
  • @PandaLee 如果你定义了一个合适的operator&lt;&lt; 重载,你可以cout &lt;&lt; b;
  • 我明白了。非常感谢,再次感谢。
猜你喜欢
  • 2023-01-24
  • 2014-10-19
  • 2010-10-11
  • 2015-03-20
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多