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

Ale*_*Ale 6 c++ types

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

vector<Person *> vect;
Run Code Online (Sandbox Code Playgroud)

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

  1. 使用旗帜;
  2. 使用typeid
  3. 要在Female的默认构造函数中插入对复制构造函数的调用,因此每次用户创建一个时,都会自动创建twin.

在多种派生类的情况下,我不喜欢第一个选项.我也不喜欢第三个选项,因为会导致关系问题(世界知道每个女性,但女性不能知道世界).所以我应该使用第二个选项:示例

typeid(vect.at(i))==typeid(Female)
Run Code Online (Sandbox Code Playgroud)

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

fre*_*low 8

拥有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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你真的想要执行一个女性的副本,这听起来很奇怪,用以下内容替换最后一行:

        females.push_back(new Female(*p));   // copy the pointee
Run Code Online (Sandbox Code Playgroud)