如何在c ++中将指向基类的指针赋给派生类的对象?

use*_*156 2 c++ pointers class base assign

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

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

除非我收到错误说no match for ‘operator=’ (operand types are ‘B’ and ‘A’),no known conversion for argument 1 from ‘A’ to ‘const B&’即使我在确定v [0]是B类之前将其分配给item1.

我意识到,如果我试图将A的对象分配给其派生类的对象,这可能会产生问题,但这就是检查的目的.我该如何解决这个问题?我是否需要做一些完全不同的事情,或者让操作员或类似的事情过载?任何帮助表示赞赏.

Pra*_*ian 7

item1 = *v[0];
Run Code Online (Sandbox Code Playgroud)

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

如果你知道它v[0]包含一个指向B对象的指针,你就可以static_cast了.

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

如果您不知道是否v[0]包含指向AB,您可以使用它来测试它dynamic_cast

auto ptr = dynamic_cast<B*>(v[0]);
if(ptr) {
  item1 = *ptr;
}
Run Code Online (Sandbox Code Playgroud)

为了dynamic_cast工作,您的A类必须至少包含一个virtual函数.


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

class A
{
  ...
  virtual ~A() = default;
};
Run Code Online (Sandbox Code Playgroud)