2015-05-08 21 views
0

我使用指針的載體來Primitive S:使用指針,重寫方法沒有被調用

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的告訴我,Instanceintersect()方法陰影Primitive方法。這是否與任何事情有關?我是C++的新手,來自Java。任何幫助表示讚賞。

+0

非虛方法沒有動態調度。 – Lingxi

回答

3

只能替換功能,如果它是虛擬的:

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

多麼愚蠢的事情。謝謝,它有效。 –