![](/img/trans.png)
[英]C++ Unable to assign base class “this” pointer the derived class object inside base class constructor
[英]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]
是否包含指向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>>
。 此外,如果您要通过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.