一.概述
派生类和基类之间的转换有3中方式:
- C语言的方式,默认的强转,如 A *pa=(A*) p,同C++的reinterpret_cast,这种转换不会改变指针地址,只是用不同的方式解析指向的内存区域。
- dynamic_cast动态转换,运行时做类型检测,编译时不做类型检测(即使将两个没有继承关系的类对象做转换也能编译通过),做转换时需要访问运行时类型信息(存放在虚表中),因此如果传入一个无效地址,可能会导致崩溃(访问虚表的过程中会访问非法内存),例:A *pa=dynamic_cast<A*>(p);
- static_cast静态转换,编译时类型检测(有继承关系的两个类才能转换,而且一定会成功,没有继承关系的两个类做转换会直接报编译错误),例:A *pa=static_cast<A*>(p);
二代码实例:
class A
{
public:
virtual void Test1() { printf("xx\n"); }
virtual ~A() {}
};
class B
{
public:
virtual void Test2() { printf("ssss\n"); }
virtual ~B() {}
};
class C:public A,public B
{
public:
virtual void Test1() { printf("xiaoge\n"); }
virtual void Test2() { printf("xiaoge\n"); }
virtual ~C() {}
};
class D :public A, public B
{
public:
virtual void Test1() { printf("xiaoge1\n"); }
virtual void Test2() { printf("xiaoge1\n"); }
virtual ~D() {}
};
1.dynamic_cast 有自动识别的功能:
D* pD=new D;
A* pA=pD;
C* pC=dynamic_cast<C*>(pA);
D* pD2=dynamic_cast<D*>(pA);
此时pC为空,pD2有值。
B* pB=dynamic_cast<B*>(pA);
能转换成功。pB有值。
2.static_cast和强转一样。
C* pC=static_cast<C*>(pA);
D* pD2=static_cast<D*>(pA);
此时pC有值,pD2也有值。
B* pB=static_cast<B*>(pA);
此种语法不能通过。
3.reinterpret_cast转换任何地址都能成功,因为它不检验地址,不改变地址。