次のコードが機能する理由を誰かが親切に説明してくれませんか? Visual Studio .NET 2008、Cygwin の g++、およびideone.comでテストしました。さらに重要なことは、それが有効かどうかを知りたいということです。A
とB
は無関係なタイプであることに注意してください。
編集:@leftaroundaboutのコメントに従って、コードに次の変更を加えました
#include <iostream>
#include <cstdlib>
class A
{
public:
virtual void Bar()
{
std::cout << "A::Bar() -> " << this << std::endl;
}
virtual void Foo()
{
std::cout << "A::Foo() -> " << this << std::endl;
}
};
class B
{
public:
virtual void Foo()
{
std::cout << "B::Foo() -> " << this << std::endl;
}
};
int main()
{
B* b = reinterpret_cast<B*>( new A );
b->Foo();
return EXIT_SUCCESS;
}
プログラムは次のメッセージを出力します。
A::Bar() -> 0x9806008
基本的に、最初の仮想メソッドは、それが何と呼ばれるかに関係なく呼び出されます。