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

Object's structure overriding defined methods?

本文关键字:方法 定义 覆盖 结构 对象      更新时间:2023-10-16

我有一个名为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()方法)实际上根本没有被调用!

为什么Sphere类中的intersection()函数没有覆盖Object类中的默认值?

您没有将函数声明为virtual,并确保方法签名匹配。更改为:

class Object{    
    virtual float intersection(Ray) {};
    virtual Vector getNormal(Vector) {};
}
class Sphere: public Object {
    ...
    virtual float intersection(Ray ray) {
...

首先,派生类引用,Object类不引用。其次,Object将它们声明为非常量,Sphere将它们定义为常量。这两者都意味着您实际上并没有覆盖同一个函数。