これは、これに対するフォローアップの質問です。
次の例を検討してください。
#include <iostream>
class A
{
};
class B : public A
{
public:
int i;
virtual void Func() = 0;
};
class C : public B
{
public:
char c;
void Func() {}
};
int main()
{
C* pC = new C;
A* pA = (A*)pC;
std::cout << "pC == " << std::hex << pC << "\n";
std::cout << "pA == " << std::hex << pA << "\n";
return 0;
}
Visual Studio 2010 では、出力は (私のマシン上で):
pC == 002DEF90 pA == 002DEF94
(これは、質問の受け入れられた回答によって説明されています)。
g++ を使用すると、出力は次のようになります。
パソコン == 0x96c8008 pA == 0x96c8008
では、問題は、g++ の実装がこのケースをどのように処理するかということです。C
vtableが必要な場合にアドレスを同じにするのは何ですか? (これが実装の詳細であることは知っていますが、そうは言わないでください :) 私は好奇心からこの実装の詳細に興味があります)。