4

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...

1
  • Why are you using new, Jack? Commented Dec 19, 2013 at 16:40

1 Answer 1

16

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!
Sign up to request clarification or add additional context in comments.

1 Comment

simply perfect. Works fine and I even have warnings now :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.