访问基类数组中的子类
Access child class in array of base class
我有一个基类数组,其中的项包含一个子类。问题是,当我尝试访问数组中的子类时,我在尝试访问时会得到错误no operator "[]" matches these operands
:
shared_ptr<P>& tmpP= (*arrayOfC)[(int)x][(int)y];
我正在尝试访问儿童类。如果我这样做:
arrayOfC[(int)x][(int)y]
然后我可以访问基类,而这不是我想要的。我尝试过使用dynamic_cast,但没有成功。
阵列是
shared_ptr<C> arrayOfC[800][600];
这是在另一个头文件中声明的,并且也使用正向声明。这就是它被保存的方式:
shared_ptr<P> childClassP= make_shared<P>(z, x, y);
arrayOfC[(int)x][(int)y] = std::move(childClassP);
您需要使用std::dynamic_pointer_cast
,此外,您还需要在基类中至少有一个虚拟析构函数,以便生成vtables,使类具有多态性关联。
#include <memory>
struct C {
virtual ~C() {}
};
struct P : public C {
};
std::shared_ptr<C> arrayOfC[8][6];
int main() {
auto derived_ptr = std::make_shared<P>();
int x {2};
int y {2};
arrayOfC[x][y] = std::move(derived_ptr);
// does not compile: std::shared_ptr<P> view = arrayOfC[x][y];
std::shared_ptr<P> view = std::dynamic_pointer_cast<P>(arrayOfC[x][y]);
return 0;
}
请参阅http://www.cplusplus.com/reference/memory/dynamic_pointer_cast/
演示:https://godbolt.org/z/qn9oq4zfb
相关文章:
- 如何在没有硬编码的情况下以C++为单位获取类数组的长度?
- 类数组插入函数
- C++访问指向结构的指针中的类数组指针
- 类数组正在损坏数据
- 如何在 turbo C++ 中增加类数组的大小?
- 如何初始化文件中的文本并将其传递给类数组,以便在c++中输出
- 从基类数组调用派生函数
- lower_bound结构节点的类数组中
- 在构造函数中使用参数创建一个类数组
- 有没有办法拥有一个未初始化的类数组,这些类在调用 delete[] 时不会被破坏?
- 使用泛型成员变量"placement new"结构/类数组的正确方法是什么?
- 如何将字符串片段读入类数组C++
- 如果类数组中的向量是动态push_backed的,内存如何工作
- C 类数组的Kotlin等效
- 指针算术,带有指向类数组的指针
- 具有多种类型的类数组?如何访问数组中的一个类型
- 尝试在类数组上使用成员函数
- 在C++中初始化抽象基类的子类数组
- 在c++中从超类数组中访问子类方法
- 调用一个方法在C多个类数组的子,执行父一个