cast_sample.cpp
#include <iostream>
using std::cout ;
using std::endl ;
#define SHOW(p) (p) ? (p)->show() : cout << "[NULL]" << endl
class B {
public:
virtual ~B(void){}
virtual void show(void){cout << "[B]" << endl ;}
} ;
class D1 : public B {
public:
virtual ~D1(void){}
virtual void show(void){cout << "[D1]" << endl ;}
} ;
class D2 : public B {
public:
virtual ~D2(void){}
virtual void show(void){cout << "[D2]" << endl ;}
} ;
void upCastSample(void){
B* pB = 0 ;
D1* pD1 = 0 ;
pD1 = new D1 ;
pB = pD1 ;
SHOW(pB) ;
delete pD1 ;
}
void downCastSample(void){
B* pB = 0 ;
D1* pD1 = 0 ;
D2* pD2 = 0 ;
pB = new D1 ;
pD1 = dynamic_cast<D1*>(pB) ;
SHOW(pD1) ;
pD2 = dynamic_cast<D2*>(pB) ;
SHOW(pD2) ;
delete pB ;
}
class B1 {
public:
virtual ~B1(void){}
virtual void show(void){cout << "[B1]" << endl ;}
} ;
class B2 {
public:
virtual ~B2(void){}
virtual void show(void){cout << "[B2]" << endl ;}
} ;
class D : public B1, public B2 {
public:
virtual ~D(void){}
virtual void show(void){cout << "[D]" << endl ;}
} ;
void crossCastSample(void){
B1* pB1 = 0 ;
B2* pB2 = 0 ;
D* pD = new D ;
pB1 = pD ;
pB2 = dynamic_cast<B2*>(pB1) ;
SHOW(pB2) ;
if (dynamic_cast<B2*>(pB1) == (B2*)pB1) {
cout <<
"クロスキャストではポインタ値は変わらないので、\n" <<
"Cスタイルのキャストで代用できる。" <<
endl ;
}else{
cout <<
"クロスキャストするとポインタ値が変化するので、\n" <<
"Cスタイルのキャストでは代用できない。" <<
endl ;
}
delete pD ;
}
main.cpp
void upCastSample(void) ;
void downCastSample(void) ;
void crossCastSample(void) ;
int main(void){
upCastSample() ;
downCastSample() ;
crossCastSample() ;
return 0 ;
}