问一个从派生类转换回到基类的方法?该怎么解决
问一个从派生类转换回到基类的方法?
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()了.不用多态..
本来多态的目的就是....而楼主用了多态之后 又...
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()了.不用多态..
本来多态的目的就是....而楼主用了多态之后 又...