gpt4 book ai didi

c++ - 如何在 C++ 中将指向基类的指针分配给派生类的对象?

转载 作者:太空狗 更新时间:2023-10-29 23:44:49 27 4
gpt4 key购买 nike

这有点难以解释,所以这里有一个例子:

class A
{
...
}

class B: public A
{
...
}

vector<A *> v; // contains pointers to objects of both type A and type B

B item1;

item1 = *v[0]; // *v[0] in this case is an object of type B

除了我得到一个错误说no match for 'operator=' (operand types are 'B' and 'A') and no known conversion for argument 1 from 'A' to 'const B&' 尽管在将 v[0] 分配给 item1 之前我会检查以确保它是 B 类型。

我意识到,如果我试图将 A 的对象分配给其派生类的对象,这可能会产生问题,但这就是检查的目的。我该如何解决这个问题?我是否需要做一些完全不同的事情,或者重载一个运算符或类似的东西?感谢您的帮助。

最佳答案

item1 = *v[0];

上面的分配不起作用,因为取消引用的静态类型 v[0]A ,并且您正在尝试将其分配给 B对象。

如果你知道v[0]包含指向 B 的指针对象,你可以static_cast

item1 = *static_cast<B*>(v[0]); // note that a copy is stored in item1

如果你不知道v[0]包含指向 A 的指针或 B ,您可以使用 dynamic_cast 对其进行测试

auto ptr = dynamic_cast<B*>(v[0]);
if(ptr) {
item1 = *ptr;
}

对于 dynamic_cast上类,你的A类必须至少包含一个 virtual功能。


最后,反对在容器中存储原始指针的常见建议。假设您在 v 中动态分配对象, 而不是 vector<A*>你应该使用 vector<unique_ptr<A>> .另外,如果你要去 delete这些对象通过 A * , 然后是 A 的析构函数需要是 virtual .

class A
{
...
virtual ~A() = default;
};

关于c++ - 如何在 C++ 中将指向基类的指针分配给派生类的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24337401/

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