使用typeid在派生类之间进行比较

时间:2012-02-01 20:46:12

标签: c++ types

我有一个指向用户插入的派生对象的指针向量(所以我猜正确的术语是“仅在运行时知道”)::

vector<Person *> vect;

派生类是男性和女性。 我想对向量进行迭代,只选择Female对象并调用它的copyconstructor。 我想了3个解决方案:

  1. 使用旗帜;
  2. 使用typeid
  3. 要在女性的默认构造函数中插入对复制构造函数的调用,因此每次用户创建一个时,都会自动创建双胞胎。
  4. 在多种派生类的情况下,我不喜欢第一个选项。 我也不喜欢第三个选项,因为会导致关系问题(世界知道每个女性,但女性不能知道世界)。 所以我应该使用第二个选项: 示例

    typeid(vect.at(i))==typeid(Female)
    

    这个表达是否正确? 有没有其他方法来概述问题?

4 个答案:

答案 0 :(得分:7)

MaleFemale继承Person听起来像是一个非常奇怪的设计,但我们走了:

vector<Person*> vect;
vector<Female*> females;
for (vector<Person*>::const_iterator it = vect.begin(); it != vect.end(); ++it)
{
    if (Female* p = dynamic_cast<Female*>(*it))
    {
        females.push_back(p);   // copy the pointer
    }
}

如果你真的想要执行女性的副本,这听起来很奇怪,请将最后一行替换为:

        females.push_back(new Female(*p));   // copy the pointee

答案 1 :(得分:3)

typeid(vect.at(i))==typeid(Female)
如果vect包含指针,则

错误。你的意思是

typeid(*vect.at(i)) == typeid(Female))

是否应使用typeid或简单标志取决于程序的体系结构,特别是您是否真的需要多态性。我真的不明白你的第三个选择。

答案 2 :(得分:3)

不要使用继承对性别进行建模,而只是在Person中使用枚举类型。然后,您可以使用transformremove_copy_if或类似内容来查找女性指示的对象。

答案 3 :(得分:1)

您也可以使用dynamic_cast执行此操作。 例如,在pp保存Female对象的情况下,这会使fp指向女性,否则为null:

Person *pp;
Female *fp;
// ... 
fp = dynamic_cast<Female *> (pp);
if (fp)
   fp->DoFemaleThing();
else
   cout << "Cast from Person to Female pointer failed";