使用環境是ubuntu14.04
static_cast和dynamic_cast:
dynamic_cast的機制貌似是轉換出錯就返回NULL,測試過4種情況:
1) A* a = new B;
B* b=dynamic_cast<B*>(a);
其中,a是b的父類,結果not null;
2) A* a = new B;
C* c=dynamic_cast<C*>(a);
C是B的兄弟類,也繼承A,結果null;3) B* b = new D;
C* c = dynamic_cast<C*>(b);
其中,D是B的子類,B和C是兄弟類,結果null;
4) A* a = new A;
E* e = dynamic_cast<E*>(a);
其中,E是不相關的類,結果null。
以上結果顯示出,除了第一種情況,dynamic_cast在其他轉換上雖然不會報錯,但轉換是無效的,這是因爲dynamic_cast是在運行的時候執行,沒法以編譯錯誤的形式顯示轉換錯誤,所以只能顯示空指針。
將以上情況全用static_cast轉換,會發現,1)和2)是not null,3)和4)會報錯。
綜上,對於下行轉換,dynamic_cast只能用於”指向派生類的父類指針轉換成對應的派生類指針“,而static_cast可用於父類向任意子類的下行轉換。
上述結論僅基於本次實驗結果,如果不妥之處,歡迎大家指出!
#include<iostream>
#include<cstring>
using namespace std;
class A
{
public:
int na;
virtual void f()
{
cout<<"hello"<<endl;
};
};
class B:public A
{
public:
int nb;
void f()
{
cout<<"hello2"<<endl;
};
};
class C:public A
{
public:
int nc;
void f()
{
cout << "hello3" << endl;
};
};
class D:public B
{
public:
int nd;
void f()
{
cout << "hello4" << endl;
};
};
class E
{
public:
int ne;
virtual void f()
{
cout<<"hello5"<<endl;
};
};
int main()
{
A* a = new B;
A* a2 = new A;
B* b;
B* b2 = new D; //D是B的子類
C* c;
C* c2; //C是B的兄弟類
C* c3 = new C;
D* d2;
E* e;
//dynamic_cast
b=dynamic_cast<B*>(a2);//結果爲not null,對應1)
if(b==NULL)
{
cout<<"null"<<endl;
}
else
{
cout<<"not null"<<endl;
}
c=dynamic_cast<C*>(a);//結果爲null,對於2)
if(c==NULL)
{
cout<<"null"<<endl;
}
else
{
cout<<"not null"<<endl;
}
c2=dynamic_cast<C*>(b2);//結果爲null,對應3)
if(c2==NULL)
{
cout<<"null"<<endl;
}
else
{
cout<<"not null"<<endl;
}
e=dynamic_cast<E*>(a2);//結果爲null,對應4)
if(e==NULL)
{
cout<<"null"<<endl;
}
else
{
cout<<"not null"<<endl;
}
//static_cast
b=static_cast<B*>(a);//結果爲not null,對應1) ,將a改成a2,結果一樣
if(b==NULL)
{
cout<<"null"<<endl;
}
else
{
cout<<"not null"<<endl;
}
c=static_cast<C*>(a2);//結果爲not null,對於2)
if(c==NULL)
{
cout<<"null"<<endl;
}
else
{
cout<<"not null"<<endl;
}
/*c2=static_cast<C*>(b2);//報錯,對應3)
if(c2==NULL)
{
cout<<"null"<<endl;
}
else
{
cout<<"not null"<<endl;
}
e=static_cast<E*>(a2);//報錯,對應4)
if(e==NULL)
{
cout<<"null"<<endl;
}
else
{
cout<<"not null"<<endl;
}*/
delete(c3);
delete(b2);
delete(a2);
delete(a);
return 0;
}
結果:
null
null
null
null
not null
not null