Если бы кто-нибудь любезно объяснил, почему работает следующий фрагмент кода, я протестировал его на Visual Studio .NET 2008, g ++ на Cygwin и 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
По сути, первый виртуальный метод вызывается независимо от того, как он называется.