关于多继承的vtbl~(一个程序的运行结果)解决方法

关于多继承的vtbl~~~~(一个程序的运行结果)
#include<iostream>
using namespace std;
class base1
{
public:
  virtual void add()=0;
};
class base2:public base1
{
public:
virtual void compute()=0;
};
class base3
{
public:
virtual void add2()=0;
};
class base4:public base2,base3
{
public:
void add(){cout<<"add"<<endl;}
void add2(){cout<<"add2"<<endl;}
void compute(){cout<<"compute"<<endl;}
};
int main()
{
base4 *temp1=new base4;
base3 *temp2=(base3*) temp1;
((base1*)temp2)->add();
return 0;
}
大家运行一下这个程序,希望明白的人能解释为什么~~~~指点一下小弟~~最好解释清楚一点,不要丢下一句"去看深入探索c++对象模型“之类的话。。。

------解决方案--------------------
这很简单啊,类base1和base3的结构完全一样(除了类名跟所含的虚函数名字不一样,没有其它任何不一样),因此所有编译器没有任何理由为它们两生成不同的内存布局。
于是,当你把一个base3强制转化成base1时,这种“巧合”几乎是必然发生的。
------解决方案--------------------
探讨
这很简单啊,类base1和base3的结构完全一样(除了类名跟所含的虚函数名字不一样,没有其它任何不一样),因此所有编译器没有任何理由为它们两生成不同的内存布局。
于是,当你把一个base3强制转化成base1时,这种“巧合”几乎是必然发生的。