动态转换 dynamic_cast
只能从上转换至下
eg:从父类指针转换成子类的指针 否则报错
class B
{
public:
virtual void test()
{
}
virtual ~B()
{
}
};
class D :public B
{
int i;
public:
D()
{
i =99;
}
void test()
{
printf("i =%d\n",i);
}
};
int main()
{
printf("1.create parent 2.create son \n");
int choice;
B* bp;
cin >> choice;
switch(choice)
{
case 1:
bp =new B;
break;
case 2:
bp =new D;
break;
}
D*dp =dynamic_cast<D*>(bp);
if(dp ==NULL)
{
//point to parent
printf("transform fail!\n");
}
else
{
//point to son
dp->test();
}
return 0;
}
静态转换 static_cast
可以从下至上 不会报错 但有访问不到子类的内容
class B
{
public:
int i;
B()
{
i =99;
}
};
class D :public B
{
public:
int j;
D()
{
j =98;
}
};
int main()
{
B*bp =new B;
D*dp =static_cast<D*>(bp);
printf("i =%d\n", dp->i);
printf("j =%d\n", dp->j);
return 0;
}
在多重继承的时候会产生地址偏移:
class B1
{
public:
int i;
B1()
{
i =99;
}
};
class B2
{
public:
int j;
B2()
{
j =98;
}
};
class D: public B1, public B2
{
public:
int k;
D()
{
k =97;
}
};
int main()
{
B1* bp1 =new B1;
printf("%x...\n",bp1);
B2* bp2 =new B2;
printf("%x...\n",bp2);
D*dp1 =static_cast<D*>(bp1);
printf("%x...\n",dp1);
D*dp2 =static_cast<D*>(bp2);
printf("%x...\n",dp2);
return 0;
}
运行结果:
255d010… //bp1 原始地址
255d030… // bp2 原始地址
255d010…// 强制转换后 第一个地址保持不变
255d02c…// 但出于第二继承的父类 指针进行偏移
const相关的强制转换
int main()
{
int i =90;
const int* p1 = &i;
int *p2 =const_cast<int*>(p1);
*p2 =100;
printf("i =%d\n",i);
return 0;
}