I came across an issue with multiple inheritance and polymorphism and isolated it down to the following code:
class class0
{
public:
virtual void test0(void);
};
class Class1
{
public:
virtual void test1(void);
virtual void test2(void);
};
class Class2 : public Class1, public class0
{
public:
virtual void test1(void);
virtual void test2(void);
virtual void test0(void);
};
void Class2::test0(void)
{
}
void class0::test0(void)
{
}
void Class1::test1(void)
{
}
void Class1::test2(void)
{
}
void Class2::test1(void)
{
}
void Class2::test2(void)
{
}
int main(void)
{
Class1* c1 = new Class2[10];
// Works
((Class2*)c1)[1].test1();
((Class2*)c1)[1].test2();
// Does not work.
c1[1].test1();
c1[1].test2();
delete[] c1;
}
Now, it seems to me that under polymorphism, both those cases should work. When I investigate c1's virtual function table, it changes at each index. Various testing has shown me the virtual function table ranges from being just plain wrong to not showing up per item correctly. For example it will show only Class1's table for c1[0], and only class0's table for c1[1]. The code that does not work will crash due to an Access Violation. This is with Visual Studio 2010, default compiler.
Maybe I am doing something wrong, this just looks like a bug though. It seems to effectively kill the ability to do polymorphism with multiple inheritance. Any explanation on what's happening here or if I am missing something important would be appreciated.
Thanks!