gpt4 book ai didi

c++ - std::bad_cast 从 parent 到 child ?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:08:57 26 4
gpt4 key购买 nike

为简单起见,

class Parent {}
class Child1 : Parent {}
class Child2 : Parent {}

在其他地方,我创建了 Child1 和 Child2 的实例,并将其存储在父级下的同一 vector 中:

// . . . in .h file, for example
vector<Parent> vector_of_parent;

// . . . in one particular method
Child1 c1;
Child2 c2;
vector_of_parent.push_back(c1);
vector_of_parent.push_back(c2);
// . . .

然后在另一个可以访问 vector_of_parent 的方法中,我尝试了

 void doSomething(Parent& some_child) { 
// wrapped in a try block somehow...
Child1& c = dynamic_cast<Child1&> some_child;
// do something if the cast is successful
}

void otherMethod() {
doSomething(vector_of_parent.at(0)); // vector_of_parent.at(0) is a Child1
}

为什么我调用otherMethod()时出现std:bad_cast?

最佳答案

你的 std::vector声明为 std::vector<Parent> .它仅包含 Parent 的实例- 当你插入 Child1Child2实例,他们得到 sliced .

如果您想使用具有公共(public)基类 Parent 的多态对象 vector ,您需要使用指针容器(或者,为了简化生命周期和内存管理,使用智能指针)。

要考虑的适当容器类型包括 std::vector<Parent*> , std::vector<std::tr1::shared_ptr<Parent> >boost::ptr_vector<Parent> .

我建议不要使用 std::vector<Parent*>除非您对手动内存管理非常满意。


此外,您需要使用公共(public)继承而不是私有(private)继承,并且基类必须具有虚拟析构函数。不过,我假设您为了简洁起见将这些省略了。

关于c++ - std::bad_cast 从 parent 到 child ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2996247/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com