具有指针的动态强制类型转换

仅限 C + + 语言使用指针的动态强制类型转换用于获取指向派生类的指针,以便使用以其他方式不可用的派生类的详细信息。 有关示例,请参阅 图 1:
图 1。 ILE 源将指针强制转换为派生类以使用其他不可用的详细信息
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中,仅当基类 employee 及其派生类不可供用户使用时,才需要动态强制类型转换 (如在库中不希望修改源代码的部分)。 否则,添加新的虚拟函数并为派生类提供这些函数的专用定义是解决此问题的更好方法。
图 2。 ILE 源获取指向派生类的指针以仅在指定的计算中使用成员函数
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 基类中的函数。