C++ inheritance ambiguity

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(foo);
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.

Share on facebook
Share on twitter
Share on linkedin
Share on print
Share on email