#include "iostream.h"
class base
{
int i;
public:
base(int I = 0):i(I) {}
virtual int value() const {return i;}
};
class derived:public base
{
public:
derived(int I = 0):base(I) {}
int value() const {return base::value()*2;}
virtual int shift(int x) const {return base::value()<< x;}
};
void main()
{
base* B[] = {new base(7),new derived(8)};
cout << "B[0]->value:"<<B[0]->value()<<endl;
cout << "B[1]->value:"<<B[1]->value()<<endl;
derived* cp = dynamic_cast<derived*>(B[1]);
if(cp)
{
cp->shift(2);
}
//cout << "B[1]->value:"<<((derived*)B[1])->shift(2)<<endl;
}
原意是想使用dynamic_cast,看B[1]是否為derived*,然后調(diào)用derived才有的shift(),但程序編譯無錯(cuò),運(yùn)行時(shí)發(fā)生錯(cuò)誤,請(qǐng)問具體是什么原因.可否詳細(xì)講解一下dynamic_cast的用法.謝謝
回復(fù)人: expert(技術(shù)專家)?? 信譽(yù):100
測(cè)一下,由于沒有return值,線程的退出代碼即傳遞給ExitThread或者TerminateThread值未知,所以編譯器把exitcode當(dāng)作有返回的main來取,就是類似int main()有一個(gè)堆棧來保護(hù)返回值那樣, 把那個(gè)返回值取出來。所以exitcode總有不同。比如你僅僅是HANDLE hThread = ::GetCurrentThread();這時(shí)候的exitcode就是hThread的值。這應(yīng)該是編譯器行為。
回復(fù)人: expert(技術(shù)專家)?? 信譽(yù):100
暈。。。。'dynamic_cast' 當(dāng)然要加/GR
樓主不會(huì)是這個(gè)錯(cuò)誤吧。。。。狂暈。。。
自做多情了半天,還以為是exitcode有什么關(guān)系。
以上僅僅是臆測(cè)~
?
點(diǎn)評(píng):
當(dāng)靜態(tài)型別與動(dòng)態(tài)型別不一治時(shí),由于虛擬函數(shù)時(shí)動(dòng)態(tài)鑒定的,所以,當(dāng)靜態(tài)是基類,而動(dòng)態(tài)是派生類時(shí),他會(huì)自動(dòng)執(zhí)行派生類的函數(shù).但是,對(duì)于,在派生類中新增加的函數(shù),不會(huì)自動(dòng)轉(zhuǎn)換,這個(gè)時(shí)候就會(huì)用到static_cast 或者是 dynamic_cast 轉(zhuǎn)換了,
感覺是這樣,呵呵
dynamic_cast是向下的轉(zhuǎn)化,就是A指針可以是否轉(zhuǎn)化為B類指針;
它有什么用呢?
當(dāng)我們必須使用派生類的特性,而該特性又沒有出現(xiàn)在基類中時(shí),我們常常要用到: