Проблемы с реализацией виртуальной функции
У меня есть некоторые проблемы с реализацией виртуальной функции родительского класса: поэтому мой код:
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
};
а в основном Ball* ball=new Ball(параметры);
Я получаю следующее сообщение "невозможно выделить объект типа ball, потому что реализованные функции являются чистыми внутри шара".
Я не понимаю, почему это не работает, так как в подклассе есть реализация...
1 ответ
Решение
Вы не переопределяете 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!