Pregunta

I have some problem implementing virtual function of a mother class: so basically my code is:

   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
};

and in main Ball* ball=new Ball(parameters);

I get the following message "cannot allocate an object of type ball because implemented funktionsare pure within ball".

I don't understand why this isn't working since there is an implementation in the subclass...

¿Fue útil?

Solución

You are not overriding Intersect or GetNormal. You need to make them const in Ball:

virtual bool Intersect (const Ray& ray, double& t) const { ... }
virtual Vector GetNormal(const Vector& at) const { ... }

In C++11, you can use the override specifier to make the compiler tell you about your mistake:

virtual Vector GetNormal(const Vector& at) override // ERROR!
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top