2016-04-17 13 views
0

タイプは変更されていますが、*(int*)&b(int*)*(int*)&bは同じアドレスを指しているはずです。仮想関数について、なぜ*(int *)&bと(int *)*(int *)&bの値が異なるのですか?

ここにソースファイルがあります。私はラインAの2つの出力が異なる理由について私を助けることができれば幸いです。

#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

まず、あなたの質問には仮想関数との関連が全くありません。

  1. *(int*)&bは、オブジェクトbのアドレスをとり、整数へのポインタにキャストし、その後、これ整数値を生成し、それをデリファレンス:限り異なる出力が行くように、その理由は次のようです。

  2. (int*)*(int*)&b上記のすべての手順を実行しますが、その整数値をとり整数ポインタにキャストします。数値は同じですが、<<演算子を使用して印刷すると16進形式で表示されるポインタ型になりますが、整数値は10進形式で表示されます。これは、異なる出力を見ている理由です。

一部のクラスのオブジェクトを印刷するには変換しないでください。 <<を使用してオブジェクトを印刷する場合は、そのオペレータをオーバーロードする必要があります。 オペレータをオーバーロードを見てみてください:

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

+0

私はそれを得た。私はちょうど最初の仮想関数のアドレスを取得したい...とにかく私はあなたに私に完全な答えを与えたと思います。どうもありがとうございました。 –

+0

@PandaLeeよろしくお願いします!答えが良かったと思ったら、時間と努力の感謝の象徴として受け入れられたとマークすることを検討してください。より多くのC++を学ぶのに最適です。 –

0

コードが定義されていないことを無視して、1つの式がポインタであり、もう1つがポインタではないという違いがあります。

Base b;int b;に置き換えると、明確になります(よく定義されています)。

*(int*)&bは、bintである*&bに相当します。
一方、(int*)*(int*)&b(int*)*&bと等しく、(int*)bint*です。

+0

しかし、私は心配しない<< b; VS2010で、しかし私は説明することができます<< *(int *)&b。だから違いがある。ここで私の第1の質問にお答えいただきありがとうございます、あなたがこのことを説明できる場合は、とても親切です。 –

+0

@PandaLee 'operator <<'の適切なオーバーロードを定義した場合、 'cout << b;'できます。 – molbdnilo

+0

私はそれを得た。もう一度、ありがとう。 –