C++查找带有指向超类的指针的子类的类型
C++ finding type of subclass with a pointer to superclass
在我的C++代码中,我有一个指向 Light 对象的指针向量。P_Light是光的一个子类,具有场位置。对于指向实际上是P_Light的光源的每个指针,我需要对位置字段执行一些操作。我做了一些搜索,似乎我可以实现一个虚拟方法,但我不需要 Light 中的方法,因为其他类型的 Light 没有位置。我也考虑过选角,但我不知道如何做到这一点。
std::vector<Vector> light_dirs;
for(int i=0; i<lights.size; i++){
Light *l = lights[i];
//cast here?
}
编辑::在不同的帖子中看到,也许使用qobject_cast是个好主意。这样看起来更好吗?
std::vector<Vector> light_dirs;
for(int i=0; i<lights.size; i++){
Light *l = lights[i];
P_Light* pl = qobject_cast<P_Light*>(l);
if(pl != nullptr) //dostuff;
}
这应该有效。
P_Light* p_light = dynamic_cast<P_Light*>(l);
检查 RTTI 和动态投射 https://en.wikipedia.org/wiki/Run-time_type_information
正如Seo指出的那样,动态强制转换可能是在不重构类结构的情况下快速适应您描述的用例的最直接方法。
作为替代方法,您可以考虑使用 Visitor 模式的实现,该模式提供编译时安全性和验证。
class P_Light;
class NP_Light;
/* abstract class providing dispatching based on
* whether Light objects interact with the position field */
class Light_Visiter{
virtual ~Light_Visiter(){}
virtual void visit(NP_light&) = 0;
virtual void visit(P_Light&) = 0;
};
class Light{
virtual ~Light(){}
virtual void visit(Light_Visitor&) = 0;
// other methods
};
class P_Light : public Light{
void visit(Light_Visitor& lv){lv.visit(*self);}
// other methods
};
/* Light objects which do not interact with the position
* field inherit from NP_Light */
class NP_Light : public Light{
void visit(Light_Visitor& lv){lv.visit(*self);}
// other methods
};
这为您提供了与动态强制转换相同的优势 - 您的类仍然独立于对其进行操作的算法 - 但调度逻辑是集中的,而不是分散在整个源代码中。
有关访客模式的更多信息,请参阅这篇不错的文章。
相关文章:
- 通过指向指针数组的指针访问子类的属性
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- 为什么带有指针子对象的文字类类型的 constexpr 表达式不能是非类型模板参数
- 为什么使用父指针指向子类?
- C++通过基类指针提升子类的序列化
- 如果指针的子类的方法对于子类是唯一的,如何访问这些方法?
- C++基类指针调用子虚函数,为什么基类指针可以看到子类成员
- 为什么指向基类的指针可以指向子类的对象?
- C++ 使用正确的子类指针
- 如何在 BaseClass 指针数组中存储指向子类对象的指针?
- 带有基类指针的强制转换向量,指向子类
- 跨子类的共享指针
- 无法将参数 3 从 'const QGraphicsItem *' 转换为 'const QObject *',这是指针,对象是 QGraphicsObject 的子类
- 如何从其抽象母类上的指针初始化子类?
- 可以将指向子类的指针分配给Varibale的超级类型
- 声明基类类型的指针,但随后通过指向子类来实例化它.这是良好的编程实践吗?
- C++ - 如何使用基指针重写子类方法
- 指向子类对象的指针的静态数组出现问题
- Arduino:指针子类的继承和数组