2015-05-08 4 views
0

Я использую вектор указателей на 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; 
    } 
} 

Моя проблема заключается в том, что цикл никогда не вызывает метод Instanceintersect(). Вместо этого он вызывает метод от Primitive. Я просто не знаю, как это может произойти в этом случае, поскольку я использую указатели повсюду.

Eclipse, говорит мне, что Instance «s intersect() метод тени метод от Primitive. О чем это связано? Я новичок в C++, исходя из Java. Любая помощь приветствуется.

+0

Невиртуальные методы не динамической диспетчеризации. – Lingxi

ответ

3

Вы можете переопределить только функцию, если это виртуальный:

virtual bool intersect(const Ray& ray, float& tmin, Intersection& isct); 
^^^^^^^ 
+0

Какая глупость. Спасибо, это работает. –

Смежные вопросы