Here’s something fun I discovered today:
class a {
public:
class b {
public:
virtual void dosomething() = 0;
};
};
class c : public a::b {
public:
class b {
public:
virtual void dosomethingelse() = 0;
};
void dosomething() {}
};
class d : public c::b {
public:
void dosomethingelse() { printf ("do something else\n"); }
void dosomething() { printf ("do something\n"); }
};
void main()
{
d *foo = new d();
c::b *myfoo = reinterpret_cast
myfoo->dosomethingelse();
}
With Visual Studio .NET 2003 you’ll see “do something” on the console. With GCC you’ll see “do something else”. In fact, with GCC you don’t even need the reinterpret_cast.