Я использую вектор указателей на Primitive
с:Использование указателей, переопределяется метод не вызывается
vector<Primitive*> primitives;
В котором я поставил указатель на класс, производный от Primitive
, а именно 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
«s intersect()
метод тени метод от Primitive
. О чем это связано? Я новичок в C++, исходя из Java. Любая помощь приветствуется.
Невиртуальные методы не динамической диспетчеризации. – Lingxi