我有一个名为Object
的课程:
class Object {
public:
Vector pos;
float emittance;
Vector diffuse;
virtual float intersection(Ray&) {};
virtual Vector getNormal(Vector&) {};
};
另一个继承它的类:
class Sphere: public Object {
public:
float radius;
virtual float intersection(Ray &ray) {
Vector distance;
float b, c, d;
distance = ray.origin - pos;
b = distance.dot(ray.direction);
c = distance.dot(distance) - radius*radius;
d = b*b - c;
cout << -b - sqrt(d);
if (d > 0.0) {
return -b - sqrt(d);
} else {
return false;
}
}
virtual Vector getNormal(Vector position) {
return (position - pos).norm();
}
};
当我编写程序时,我期待它开始吐出大量的文本行。但由于某种原因,整个方法(intersection()
方法)根本就没有被实际调用过!
为什么intersection()
类中的Sphere
函数不会覆盖Object
类中的默认值?
答案 0 :(得分:0)
您没有将该函数声明为virtual
,并确保方法签名匹配。将其更改为:
class Object{
virtual float intersection(Ray) {};
virtual Vector getNormal(Vector) {};
}
class Sphere: public Object {
...
virtual float intersection(Ray ray) {
...
答案 1 :(得分:0)
首先,派生类接受引用,而Object类不接受引用。其次,Object将它们声明为非const,并且Sphere将它们定义为const。这两个都意味着你实际上没有覆盖相同的功能。