【问题标题】:How to assign a pointer to base class to an object of a derived class in c++?如何将指向基类的指针分配给 C++ 中派生类的对象?
【发布时间】:2014-08-11 19:25:53
【问题描述】:

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

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&amp;’,尽管我会在将 v[0] 分配给 item1 之前检查以确保它是 B 类型。

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

【问题讨论】:

  • 标题听起来很奇怪!这样的操作应该达到什么效果?!?

标签: c++ class pointers base assign


【解决方案1】:
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&lt;A*&gt;,您应该使用vector&lt;unique_ptr&lt;A&gt;&gt;。另外,如果你要通过A *delete 这些对象,那么A 的析构函数需要是virtual

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

【讨论】:

    【解决方案2】:

    dynamic_cast 就是这样做的。

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

    【讨论】:

    • 我认为这与它有关。谢谢!
    • @ikh:是的,可以在循环的控制语句中声明变量(这在for 循环中很常见)和条件语句。
    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2013-03-04
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    相关资源
    最近更新 更多