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

时间:2011-12-04 16:36:18

标签: 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);
};

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

因此,例如,在Sphere类中,这是实现的:

const Vec3 Sphere::normal(Vec3 p)
{
  return (p - d_center).normalize();
}

当我'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

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

2 个答案:

答案 0 :(得分:5)

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

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

virtual const Vec3 normal(Vec3 p);

到此:

virtual const Vec3 normal(Vec3 p) const;

表示在normal(...)对象上调用const是“安全的”。

同样,改变这个:

const Vec3 Sphere::normal(Vec3 p)

到此:

const Vec3 Sphere::normal(Vec3 p) const

答案 1 :(得分:1)

与编译器一样,尝试从const函数调用非const函数会失去对象本身的常量。

你也必须使normal函数const,或者避免调用它。