dynamic_cast必须对指针操作,并且含有虚函数
以下注释行是编译出错行
class A{
public:
virtual ~A(){}
};
class B:public A{public:virtual ~B(){}};
class C{};
int main()
{
B b,*pb;
A a,*pa;//A B有继承关系
C c,*pc;
a=static_cast<A>(b);
// b=static_cast<B>(a);
// pb=pa;
pb=static_cast<B*>(pa);
pa=static_cast<A*>(pb);
// a=dynamic_cast<A>(b);
// b=dynamic_cast<B>(a);
pb=dynamic_cast<B*>(pa);
pa=dynamic_cast<A*>(pb);
// c=static_cast<C>(b);
pc=dynamic_cast<C*>(pb);
}
在多重继承中static_cast转换前后的两指针不一定相等,如:
class A
{
private:
int n;
};
class B
{
private:
char c;
};
class C: public A, public B
{};
void func(B * pb)
{
C *pc1 = static_cast<C*> (pb); //correct offset adjustment
C *pc2 = reinterpret_cast<C*> (pb); //no offset calculated
}
由于static_cast考虑到C结构中含有A结构的int 4个字节,如:
pc1=0x0064fdf0,pc2=pb=0x0064fdf4