我在实现一个母类的虚函数时遇到了一些问题:基本上我的代码是:
class Shape { public: virtual ~Shape(); virtual bool Intersect (const Ray& ray, double& t) const =0;// to premit abstraktion (definition in sub-classes) virtual Vector GetNormal(const Vector& at) const =0; protected: Color color; double dc; //diffusive component }; class Ball: public Shape { public: Ball(const Color& col,const double diff,const double x,const double y,const double z,const double radius): cx(x),cy(y),cz(z),r(radius) { Shape::color=col; Shape::dc=diff; assert(radius!=0); } virtual bool Intersect (const Ray& ray, double& t) { Vector c(cx,cy,cz), s(ray.xs,ray.ys,ray.zs); Vector v(s-c); double delta(std::pow(v*ray.dir,2)-v*v+r*r); if(delta<0) return false; const double thigh(-v*ray.dir+std::sqrt(delta)), tlow(-v*ray.dir-std::sqrt(delta)); if(thigh<0) return false; else if (tlow<0){t=thigh; return true;} else{t=tlow; return true;} assert(false);//we should never get to this point }; virtual Vector GetNormal(const Vector& at) { Vector normal(at - Vector(cx,cy,cz)); assert(Norm(normal)==r);// the point where we want to get the normal is o the Ball return normal; }; private: // already have color and dc double cx,cy,cz; //center coordinates double r;//radius };
并在主球*球=新球(参数);
我得到以下消息"无法分配类型球的对象,因为实现的funktions是纯粹的球内".
我不明白为什么这不起作用,因为子类中有一个实现...
您还没有覆盖Intersect
或GetNormal
.你需要让他们const
在Ball
:
virtual bool Intersect (const Ray& ray, double& t) const { ... } virtual Vector GetNormal(const Vector& at) const { ... }
在C++ 11中,您可以使用说明override
符使编译器告诉您错误:
virtual Vector GetNormal(const Vector& at) override // ERROR!