2012-04-29 103 views
4

我在光线跟踪任务的工作冲突,这里是有问题的来源:从两个类继承,具有相同功能的原型类,互相

class Geometry 
{ 
    public: 
     virtual RayTask *intersectionTest(const Ray &ray) = 0; 
}; 

class Sphere : public Geometry 
{ 
    public: 
     RayTask *intersectionTest(const Ray &ray); 
}; 

class BoundingVolume 
{ 
    public: 
     virtual bool intersectionTest(const Ray &ray) = 0; 
}; 

class BoundingSphere : public Sphere, BoundingVolume 
{ 
    public: 
     bool intersectionTest(const Ray &ray) // I want this to be inherited from BoundingVolume 
     { 
      return Sphere::intersectionTest(ray) != NULL; // use method in Sphere 
     } 
}; 

源之上无法编译,错误信息:

error: conflicting return type specified for ‘virtual bool BoundingSphere::intersectionTest(const Ray&)’ 
error: overriding ‘virtual RayTask Sphere::intersectionTest(const Ray&) 

我想在球的使用方法来实现BoundingSphere所:: intersectionTest,所以我需要从两个包围体和球体继承。但由于继承函数具有不同的返回类型相同的参数列表,事情搞砸了......

我不想重复具有相同功能的代码... 可以任何一个给我一个解决方案? ..

+0

只有使用不同的返回类型才能做到这一点。方法签名是方法名称,其参数的数量和类型,在这里都是相同的。 – DumbCoder 2012-04-29 14:44:34

+0

谢谢...我必须更改我的函数名称... – Tim 2012-04-29 14:56:41

+0

修饰符(如const)也构成方法签名的一部分 – EdChum 2012-04-29 15:08:44

回答

1

编译器试图重写两个具有不同返回类型的虚方法,这是不允许的:编译器如果知道为函数调用分配多少内存,如果它不知道返回类型将会?这两种方法不能有相同的名称;尝试改变一个更合适的意思。

如果您觉得这些名称最能代表它们提供的操作的含义(我不确定),我还建议您仔细考虑您的层次结构。是球形的BoundingVolume真的是Sphere?也许不是:它的执行条款是Sphere(私有继承,并不能解决你的问题),或者它有一个Sphere(组合,在这种简单情况下可以解决你的问题)。不过,后一种情况可能会出现移动复杂类别的问题,您希望BoundingSphere具有Sphere的所有方法。或者,您是否需要区分BoundingVolumes和正常的Geometry

该问题的另一个解决方案是使用非成员函数作为这些层次结构之一,Koenig lookup(参数的类型)调用正确的版本。如果没有真正了解你的层次结构是什么样的,我不能说。但是要考虑你的设计:如果你有相同名称的操作给你回完全不同的语义结果,操作是否正确命名/设计?

+0

非常感谢!你会想起我的设计是否适合我的需求。 'BoundingVolume'和'Geometry'应该相互区分,并且在'Sphere'里面实现'BoundingSphere'更合理。 – Tim 2012-04-30 03:12:36

相关问题