10.05.2007

dynamic_cast

C++ 的dynamic 是要配合RTTI 做的,他可以把class pointer cast 成他的derive class。
如果那個class 本身就是base class 的pointer,不是由derive class pointer cast 過來的,
dynamic_cast 就會 return NULL。

那...他怎麼知道他原來是那一個class pointer ?

所以要RTTI的支援呀!

#include <iostream>
using namespace std;

class A
{
public:
virtual void print() { cout << "A: print" << endl; };
};

class B : public A
{
public:
virtual void print() { cout << "B: print" << endl; };
};

void callprint(A* a)
{
a->print();
B * b = dynamic_cast<B*&t;(a);
if(b)
b->print();
else
cout << " callprint fail " << endl;
}

int main()
{
A* pa = new A;
B* pb = new B;

cout << "now pass A:";
callprint(pa);

cout << "now pass B:";
callprint(pb);

return 0;
}
大意是callprint 會將傳入的point cast 成 child class B。
於是main program 先傳A進去看看他會不會被騙,再傳B進去看看是不是OK.
結果是..
now pass A: A: print
callprint error!
now pass B: B: print
B: print

所以..用dynamic_cast< > 真的可以cast一個base class 到他的derive class喔。

沒有留言: