使用指针,不调用重写的方法
Using pointers, overridden method not being called
我正在使用指向 Primitive
s:
的指针向量
vector<Primitive*> primitives;
我在其中放置了一个指向从 Primitive
派生的 class 的指针,即 Instance
:
Shape * s = new Sphere();
PhongMaterial* mat = new PhongMaterial(this, 0.6, 0.15, 0.2, Color(1, 0, 0), 50);
Instance* redSphere = new Instance(s, mat);
redSphere->scale(1, 10, 1);
primitives.push_back(redSphere);
这是Instance.h
:
class Instance: public Primitive {
private:
Transform* invTransform;
public:
Instance(Shape * const s, Material* const mat);
bool intersect(const Ray& ray, float& tmin, Intersection& isct);
bool shadow_hit(const Ray& ray, float& tmin);
void scale(float a, float b, float c);
~Instance() {
;
}
};
这是Primitive.h
:
class Primitive {
private:
Shape* shape;
Material* material;
public:
Primitive(Shape * const s, Material* const mat);
bool intersect(const Ray& ray, float& tmin, Intersection& isct);
bool shadow_hit(const Ray& ray, float& tmin);
~Primitive() {
;
}
};
我是这样使用的:
for (int i = 0; i < primitives.size(); i++) {
float t;
if (primitives[i]->intersect(ray, t, iTmp) && t < tMin) {
tMin = t;
isect = iTmp;
}
}
我的问题是循环从不调用 Instance
intersect()
方法。相反,它从 Primitive
调用方法。我只是不知道在这种情况下对象切片是如何发生的,因为我到处都在使用指针。
Eclipse 告诉我 Instance
的 intersect()
方法 shadows 来自 Primitive
的方法。这有什么关系吗?我是 C++ 的新手,来自 Java。感谢您的帮助。
您只能覆盖虚拟函数:
virtual bool intersect(const Ray& ray, float& tmin, Intersection& isct);
^^^^^^^
我正在使用指向 Primitive
s:
vector<Primitive*> primitives;
我在其中放置了一个指向从 Primitive
派生的 class 的指针,即 Instance
:
Shape * s = new Sphere();
PhongMaterial* mat = new PhongMaterial(this, 0.6, 0.15, 0.2, Color(1, 0, 0), 50);
Instance* redSphere = new Instance(s, mat);
redSphere->scale(1, 10, 1);
primitives.push_back(redSphere);
这是Instance.h
:
class Instance: public Primitive {
private:
Transform* invTransform;
public:
Instance(Shape * const s, Material* const mat);
bool intersect(const Ray& ray, float& tmin, Intersection& isct);
bool shadow_hit(const Ray& ray, float& tmin);
void scale(float a, float b, float c);
~Instance() {
;
}
};
这是Primitive.h
:
class Primitive {
private:
Shape* shape;
Material* material;
public:
Primitive(Shape * const s, Material* const mat);
bool intersect(const Ray& ray, float& tmin, Intersection& isct);
bool shadow_hit(const Ray& ray, float& tmin);
~Primitive() {
;
}
};
我是这样使用的:
for (int i = 0; i < primitives.size(); i++) {
float t;
if (primitives[i]->intersect(ray, t, iTmp) && t < tMin) {
tMin = t;
isect = iTmp;
}
}
我的问题是循环从不调用 Instance
intersect()
方法。相反,它从 Primitive
调用方法。我只是不知道在这种情况下对象切片是如何发生的,因为我到处都在使用指针。
Eclipse 告诉我 Instance
的 intersect()
方法 shadows 来自 Primitive
的方法。这有什么关系吗?我是 C++ 的新手,来自 Java。感谢您的帮助。
您只能覆盖虚拟函数:
virtual bool intersect(const Ray& ray, float& tmin, Intersection& isct);
^^^^^^^