繁体   English   中英

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

[英]How to assign a pointer to base class to an object of a derived class in c++?

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

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')并且no known conversion for argument 1 from 'A' to 'const B&'即使我会检查以确保在将其分配给item1之前,v [0]属于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]是否包含指向AB的指针,则可以使用dynamic_cast对其进行测试

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

要使dynamic_cast工作,您的A类必须至少包含一个virtual函数。


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

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

这就是dynamic_cast作用。

if ( B* b = dynamic_cast<B*>(v[0]) )
{
    item1 = *b;    // *v[0] in this case is an object of type B
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM