对象的结构覆盖定义的方法?

时间:2011-06-07 21:05:57

标签: c++ class

我有一个名为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类中的默认值?

2 个答案:

答案 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。这两个都意味着你实际上没有覆盖相同的功能。