标签:派生类 png highlight image 引用 强制类型转换 foo 使用 类型转换
(2)dynamic_cast:将基类类型的指针或引用安全的转换为派生类型的指针或引用。
对于带虚函数的类,在运行时执行RTTI操作符,返回动态类型信息;对于其他类型,在编译时执行RTTI,返回静态类型信息。
dynamic_cast 操作符
如果dynamic_cast转换指针类型失败,则返回0;如果转换引用类型失败,则抛出一个bad_cast的异常。
class People { public: People(){} People(int size):m_size(m_size){} virtual ~People(){} private: int m_size; }; class Son : public People { public: Son(int type):m_type(type){} virtual ~Son(){} int getType(){return this->m_type ; } private: int m_type; }; int main() { People *p = new People(12); Son *s = new Son(10); // People *p1 = new Son(34); s = dynamic_cast<Son*>(p1) ; cout << typeid(*s).name() << endl; cout << typeid(*p1).name() << endl; try{ Son &tmp = dynamic_cast<Son &>(*p1); cout << tmp.getType() << endl; }catch(bad_cast) { // ???д???; }
typeid操作符
typeid能够获取一个表达式的类型:typeid(e)。
typeid最常见的用途是比较两个表达式的类型,或者将表达式的类型与特定类型相比较。
包含 #include <typeinfo>
struct B {} b, c; struct D : B {} d; int main(){ const std::type_info& tb = typeid(b); const std::type_info& tc = typeid(c); const std::type_info& td = typeid(d); assert(tb == tc); // b和c具有相同的类型 assert(&tb == &tc); // tb和tc引用的是相同的对象 assert(tb != td); // 虽然D是B的子类,但是b和d的类型却不同 assert(&tb != &td); // tb和td引用的是不同的对象 }
二 运行时运行识别
typeid 实现运行时类型识别,必须时一个动态类(含有虚函数 virtual)
struct B { virtual void foo() {} }; struct C { virtual void bar() {} }; struct D : B, C {}; void test() { D d; B& rb = d; C& rc = d; assert(typeid(rb) == typeid(d)); // rb引用的类型与d相同 assert(typeid(rb) == typeid(rc)); // rb引用的类型与rc引用的类型相同 }
标签:派生类 png highlight image 引用 强制类型转换 foo 使用 类型转换
原文地址:http://www.cnblogs.com/vagabond/p/6024669.html