我重写这种方法的方式有什么问题?

时间:2013-02-27 21:44:55

标签: c++ inheritance method-overriding

我正在尝试构建一个光线跟踪器。我有一个名为Shape的类,我将其扩展到Sphere类(以及其他形状,如三角形)。 Shape有方法

virtual bool intersect(Ray) =0;

所以我按

创建了Sphere类
class Sphere : public Shape{
public:
    Sphere(){};
    bool intersect(Ray){/*code*/};
};

我有一个主类,我用它来创建一个Shape指针列表。我创建一个Sphere指针并执行以下操作:

Sphere* sph = &Sphere();
shapes.emplace_front(sph); //shapes is a list of Shape pointers

然后,当我想在另一个班级中追踪光线时,我会做以下事情:

for (std::list<Shape*>::iterator iter=shapes.begin(); iter != shapes.end(); ++iter) {
    Shape* s = *iter;
    bool hit = (*s).intersect(ray);
}

但是我得到的错误是我不能在虚拟类Shape上调用intersect,即使它应该是* s指向Sphere类型对象。我的继承错误是什么?

1 个答案:

答案 0 :(得分:4)

一个问题是:

Sphere *sph = &Sphere();

它创建一个类型为Sphere的临时对象,存储指向该临时对象的指针,然后销毁该临时对象。结果是无稽之谈。

将其更改为:

Sphere *sph = new Sphere();
事情会好得多。