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的对象分配给其派生类的对象,这可能会产生问题,但这就是检查的目的.我该如何解决这个问题?我是否需要做一些完全不同的事情,或者让操作员或类似的事情过载?任何帮助表示赞赏.
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]
包含指向A
或B
,您可以使用它来测试它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)