如何将基类指针赋值给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&’
,即使我检查确保v[0]是B类型之前,我把它赋值给item1。
我意识到,如果我试图将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
}
相关文章:
- 为什么此派生对象无法访问基类的后递减方法?
- 如何在新的派生对象中获取基本对象的数据?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 在没有默认构造函数的情况下创建的派生对象
- OOP 标识派生对象
- 如何创建派生对象的向量?
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- 如何从 Gtk::窗口调用派生对象的析构函数
- 无法在派生对象上运行虚拟函数
- 尝试删除指向派生对象的基指针时断言错误
- 存储在一个通用容器中的派生对象.如何避免铸造
- 将派生对象分配给函数内的基类指针
- 替换派生对象向量中的对象"no matching function to call"
- 派生对象调用的 Base 方法的模板推导
- 用于填充 Base 和派生对象的 shared_ptr 向量的函数模板
- C++ UBSAN 对派生对象产生误报
- 如何验证我是否正在使用C++中的基对象或派生对象
- C++ 构造函数和派生对象
- 将派生对象传递给模板
- 指向派生作品的基本指针,即使派生对象不存在