Typeid问题以确定处理哪些数据

时间:2014-04-15 01:11:14

标签: c++ pointers polymorphism typeid

为什么这会返回false,我该如何解决?我正在尝试创建一个程序,将数据写入文件,然后可以读回该文件并显示它。此外,还有3个班级。一个是父类(MyEmployee未显示),Hourly和Salaried类是子类。

  for (int i = 0; i < ARRAY_SIZE; i++)
        {
            MyEmployee* empPtr = payroll[i];
            if (typeid(*empPtr) == typeid(Hourly))
            {
                Hourly* empHPtr = static_cast<Hourly*>(empPtr);
            }
            else if (typeid(*empPtr) == typeid(Salaried))
            {
                Salaried* empSPtr = static_cast<Salaried*>(empPtr);
            }
        }
        for (int i = 0; i < ARRAY_SIZE; i++)
        {
            payroll[i]->writeData(myWrittenFile);
        }

2 个答案:

答案 0 :(得分:0)

如果MyEmployee是多态的,请使用dynamic_cast < type-id > ( expression ) 这将操作数表达式转换为type-id类型的对象,如果转换失败,则返回0。

MyEmployee* empPtr = payroll[i];
if (dynamic_cast<Hourly*>(empPtr))
{
  ...
} 

答案 1 :(得分:0)

我猜你的班级层次结构是:

struct MyEmployee { virtual ~MyEmployee() {}; /* ... */ };

struct Hourly : MyEmployee { /* ... */ };
struct Salaried : MyEmployee { /* ... */ };

如果是这样,那么您可以用以下代码替换您的代码:

MyEmployee *empPtr = payroll[i];
Hourly *empH = dynamic_cast<Hourly *>(empPtr);
Salaried *empS = dynamic_cast<Salaried *>(empPtr);

如果对象不属于该类型,则empHempS将为null;和一个有效的指针,如果它是那种类型。

当然,用克里斯建议用虚拟函数替换整个事物可能更好。