标签:操作 font 不同 指针 异常 public pre 向量 c++11
RTTI
对象转型模板
typeid操作符与type_info类
type_info类
typeid操作符
//programmer类是Employee的派生类 #include <typeinfo> Programmer P; Employee &e = P; //输出P实际类名的字符串“programmer” cout << typeid(e).name() << endl;
dynamic_cast
动态转型的三种方式:
向上转型:沿着类继承层次向基类转型
向下转型:沿着类继承层次向派生类转型
交叉转型:沿着类多重继承层次横向转型
指针的动态转型
正确执行时,结果为指向目标类对象的指针
错误执行时,结果为0/NULL(C++11:nullptr)
引用的动态转型
正确执行时,结果为目标类对象的引用
错误执行时,引发bad_cast异常
例子:假设软件公司包括程序员和经理两类职员,需要按照不同规则支付薪水和奖金,如何实现呢?
class Employee { public: virtual void PaySalary(); virtual void PayBonus(); }; class Manager :public Employee { public: virtual void PaySalary(); virtual void PayBonus(); }; class Programmer :public Employee { public: virtual void PaySalary(); virtual void PayBonus(); }; class Company { public: virtual void PayRoll(Employee *e); virtual void PayRoll(Employee &e); private: vector<Employee *> _employees;//向量保存雇员 }; void Company::PayRoll(Employee *e)//版本1 { //调用哪个成员函数,如何区分程序员和经理 e->PaySalary(); e->PayBonus(); } void Company::PayRoll(Employee *e)//版本2 { Programmer *p = dynamic_cast<Programmer *>(e); if (p) //p确实指向程序员对象 { p->PaySalary(); p->PayBonus(); } else//p不指向程序员,不发奖金 { e->PaySalary(); } } void Company::PayRoll(Employee &e)//版本3 { try { Programmer &p = dynamic_cast<Programmer&>(e); p.PaySalary(); p.PayBonus(); } catch (std::bad_cast) { e.PaySalary(); } }
标签:操作 font 不同 指针 异常 public pre 向量 c++11
原文地址:http://www.cnblogs.com/hujianglang/p/6246867.html