一.概述
派生类和基类之间的转换有3中方式:
a.默认的强转,如 A *pa=(A*) p;
b.dynamic_cast转换,A *pa=dynamic_cast<A*>(p);
c.static_cast转换,A *pa=static_cast<A*>(p);
还有一种强制转换为 reinterpret_cast,这种转换不会改变地址。
二代码实例:
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转换任何地址都能成功,因为它不检验地址,不改变地址。