具有指针的动态强制类型转换
使用指针的动态强制类型转换用于获取指向派生类的指针,以便使用以其他方式不可用的派生类的详细信息。 有关示例,请参阅 图 1:class employee {
public:
virtual int salary();
};
class manager : public employee {
public:
int salary();
virtual int bonus();
};使用 图 1中使用的类层次结构,可以使用动态强制转型将 manager::bonus() 函数包含在经理的工资计算中,但不能包含在普通员工的计算中。 dynamic_cast 运算符使用指向基类 employee的指针,并获取指向派生类 manager 的指针以使用 bonus() 成员函数。
在 图 2中,仅当基类 图 2。 ILE 源获取指向派生类的指针以仅在指定的计算中使用成员函数
employee 及其派生类不可供用户使用时,才需要动态强制类型转换 (如在库中不希望修改源代码的部分)。 否则,添加新的虚拟函数并为派生类提供这些函数的专用定义是解决此问题的更好方法。void payroll::calc (employee *pe) {
// employee salary calculation
if (manager *pm = dynamic_cast<manager*>(pe)) {
// use manager::bonus()
}
else {
// use employee's member functions
}
}在 图 2中:
- 如果
pe在运行时实际指向manager对象,那么动态强制类型转换成功,pm将初始化为指向manager的指针,并使用bonus()函数。 - 如果
pe在运行时未指向manager对象,那么pm将初始化为零,并且仅使用employee基类中的函数。