问一个从派生类转换回到基类的方法?该怎么解决

问一个从派生类转换回到基类的方法?
class   base
{
public:
virtual   void   vf()   {   printf( "base   vf\n ");}
};

class   s1   :   public   base
{
public:
virtual   void   vf()   {   printf( "s1   vf\n ");}
};

class   s2   :   public   base
{
public:
virtual   void   vf()   {   printf( "s2   vf\n ");}
};

class   c   :public   s1,   public   s2
{
public:
virtual   void   vf()   {   printf( "c   vf\n ");}
};

int   main()
{
c   o;

//类   c   派生至   s1   和   s2,   s1,s2都有   虚拟成员函数   vf()
//我需要把对象   o   从   c   转换到   s1   或   s2

s1*   o1   =   dynamic_cast <s1*> (&o); //动态转换   c   ==>   s1,但这时   vf()依然是指向   c::vf()

s1   temp; //建立一个   s1   临时对象   temp,用于获取   s1的vtable
memcpy(o1,   &temp,   1   *   sizeof(void*)); //复制   temp的   vtable到   o1

o1-> vf(); //指向   s1::vf()了

getch();
return   0;
}

这个方法似乎可以达到我的要求,不过需要人工计算   s1,   s2   的   vtable   的大小
不知道有没有其他更好的方法

------解决方案--------------------
c objDerived;
s1 objBase = objDerived; // 编译器自动把派生类对象的s1子对象切出来
------解决方案--------------------
建立另一套继承体系,使void vf() 不为虚函数。
------解决方案--------------------
汗!
o.base::vf()即可。
------解决方案--------------------
class base
{
public:
void vf() { printf( "base vf\n ");}
};

class s1 : public base
{
public:
void vf() { printf( "s1 vf\n ");}
};

class s2 : virtual public base
{
public:
void vf() { printf( "s2 vf\n ");}
};

class c :public s1, public s2
{
public:
void vf() { printf( "c vf\n ");}
};

int main()
{
c o;
s1* o1 = dynamic_cast <s1*> (&o);
o1-> vf();
return 0;
}
这样o1-> vf()就指向 s1::vf()了.不用多态..

本来多态的目的就是....而楼主用了多态之后 又...