使用虚函数和/或c ++中的const"丢弃限定符"错误

Fra*_*ris 0 c++ inheritance const

我研究这个问题越多,我似乎就越困惑.这是一个家庭作业问题,涉及增加我们教授给我们的代码.我知道这个问题与const关键字有关,还有一些令人困惑的新应用程序.

有一个泛型类Object,从中继承了几个子类(Sphere,Cone,Polygon).以下是Object中的类:

public: // computational members                                                
    // return t for closest intersection with ray                               
    virtual float intersect(const Ray &ray) const = 0;

    // return color for intersection at t along ray r                           
    virtual const Vec3 appearance(const World &w,
                                  const Ray &r, float t) const = 0;

    //The following function is added by me
    virtual const Vec3 normal(Vec3 p);
};
Run Code Online (Sandbox Code Playgroud)

我添加了最终功能,正常.

因此,在Sphere类中,这样实现:

const Vec3 Sphere::normal(Vec3 p)
{
  return (p - d_center).normalize();
}
Run Code Online (Sandbox Code Playgroud)

当我'make'时,我收到以下错误:

Appearance.cpp: In member function ‘const Vec3 Appearance::eval(const World&, const Vec3&, const Vec3&, Vec3, int) const’:
Appearance.cpp:46: error: passing ‘const Object’ as ‘this’ argument of ‘virtual const Vec3 Object::normal(Vec3)’ discards qualifiers
make: *** [Appearance.o] Error 1
Run Code Online (Sandbox Code Playgroud)

你能帮我理解为什么会这样吗?谢谢你的帮助.

rua*_*akh 5

当错误消息引用‘this’ argument方法时,它意味着(指向)您正在调用方法的对象.例如,in shape->normal(v),shapethis参数.

要指定给定方法不修改自己的对象 - 它的this参数 - 您需要附加 const到其声明.所以,改变这个:

virtual const Vec3 normal(Vec3 p);
Run Code Online (Sandbox Code Playgroud)

对此:

virtual const Vec3 normal(Vec3 p) const;
Run Code Online (Sandbox Code Playgroud)

表示调用normal(...)一个const对象是"安全的" .

同样,改变这个:

const Vec3 Sphere::normal(Vec3 p)
Run Code Online (Sandbox Code Playgroud)

对此:

const Vec3 Sphere::normal(Vec3 p) const
Run Code Online (Sandbox Code Playgroud)