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...
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!
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With