我有一个指向用户插入的派生对象的指针向量(所以我猜正确的术语是“仅在运行时知道”)::
vector<Person *> vect;
派生类是男性和女性。 我想对向量进行迭代,只选择Female对象并调用它的copyconstructor。 我想了3个解决方案:
在多种派生类的情况下,我不喜欢第一个选项。 我也不喜欢第三个选项,因为会导致关系问题(世界知道每个女性,但女性不能知道世界)。 所以我应该使用第二个选项: 示例
typeid(vect.at(i))==typeid(Female)
这个表达是否正确? 有没有其他方法来概述问题?
答案 0 :(得分:7)
让Male
和Female
继承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
中使用枚举类型。然后,您可以使用transform
或remove_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";