2013-12-19 56 views
4

我有一些问题,实现一个母亲类的虚函数: 所以基本上我的代码是:问题,实现虚拟功能

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在球内是纯的”。

我不明白为什么这是行不通的,因为在子类中实现...

+0

,杰克? – Shoe

回答

16

你是不是覆盖IntersectGetNormal。你需要让他们constBall

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

在C++ 11,可以使用override specifier使编译器告诉你关于你的错误:你为什么要使用`new`

virtual Vector GetNormal(const Vector& at) override // ERROR! 
+0

简单完美。工作正常,我甚至有警告:) – user2351468