我有一个虚基类Shape
:如何检查一个指针是否指向一个虚拟基类而不是C++中的子类?
class Shape {
public:
virtual bool intersect(Ray& r, HitRecord& rec)=0;
virtual Material material()=0;
};
我认为其所谓的“纯虚”类。所以我认为我应该而不是尝试在任何时候实例化它。
不过,我有一个结构HitRecord
存储指针的Shape
子类,因为我不知道什么课究竟该指针指向,我通过Shape*
定义它:
struct HitRecord {
float t;
vec3f p; // point coord
vec3f norm;
Shape* obj;
};
我实际上是在试图建立一个光线追踪器,所以我有一个intersect()
来检查光线是否与形状相交。如果光线不是与场景中的任何形状相交,则rec
变量将不会改变,即rec.obj
指向Shape
。
因此,每次发生这种情况,我都会得到一个BAD_ACCESS
错误,因为**我想访问rec.obj
的成员变量。它应该在rec.obj
指向Shape
的子类时起作用,但当它指向Shape
时不起作用。
bool intersect(Ray& r, HitRecord& rec) {
rec.t = 100;
for (std::vector<Shape* >::iterator it = shapes.begin(); it != shapes.end(); ++it) {
HitRecord tmpRec;
if ((*it)->intersect(r, tmpRec) && tmpRec.t < rec.t) {
rec = tmpRec;
}
}
}
所以现在我想检查指针是否指向确切的Shape
基类。我试过dynamic_cast
,但似乎并不适合这种情况。
我想知道这是不是“设计问题”。如果没有,我如何检查指针是否指向Shape
?
也许不是你在找的东西,但是许多调试器在检查基类指针时显示动态类型。 – ComicSansMS
你怎么能够得出'obj'没有指向派生类型'Shape'的情况? (除了'nullptr'或未初始化。) – juanchopanza
对不起,我是新来的c + +。在我的代码中,在'intersect()'中,如果'if'块永远不会到达,'rec'将不会被更新。当'rec'被传入'intersect()'时,它就被声明了('HitRecord rec;')。我不确定如果我没有明确地指定什么'obj'指向..? –