dynamic_cast

// dynamic_cast_8.cpp
// compile with: /GR /EHsc
#include <stdio.h>
#include <iostream>


struct A {
virtual void test() {
printf_s("in A\n");
}
};


struct B : A {
virtual void test() {
printf_s("in B\n");
}


void test2() {
printf_s("test2 in B\n");
}
};


struct C : B {
virtual void test() {
printf_s("in C\n");
}


void test2() {
printf_s("test2 in C\n");
}
};


void Globaltest(A& a) {
try {
C &c = dynamic_cast<C&>(a);
printf_s("in GlobalTest\n");
}
catch(std::bad_cast) {
printf_s("Can't cast to C\n");
}
}


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


pa->test(); //in C 虚函数 根据 对象类型 确定


B * pb = dynamic_cast<B *>(pa);
if (pb)
pb->test2(); // test2 in B  重名的非虚函数 根据 指针类型 确定


C * pc = dynamic_cast<C *>(pa2); //pa2 指向的对象不包含c对象,不可以转换 则pc为NuLL
if (pc)
pc->test2(); 


C ConStack;
Globaltest(ConStack);// in GlobalTest


// will fail because B knows nothing about C
B BonStack;
Globaltest(BonStack);
}

你可能感兴趣的:(dynamic_cast)