我正在处理光线追踪任务,这是有问题的来源:
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&)
我想在 Sphere 中使用方法实现 BoundingSphere::intersectionTest,所以我需要从 BoundingVolume 和 Sphere 继承。但是由于继承函数具有相同的参数列表和不同的返回类型,事情变得一团糟......
我不想复制具有相同功能的代码...
谁能给我一个解决方案?...
最佳答案
编译器试图覆盖两个具有不同返回类型的虚拟方法,这是不允许的:如果编译器不知道返回类型是什么,它如何知道为函数调用分配多少内存?两个方法不能同名;尝试将其更改为更合适的含义。
如果您认为这些名称最能代表它们都提供的操作的含义(我不确定),我还建议您仔细考虑您的层次结构。球形 BoundingVolume
真的是 Sphere
吗?也许不是:它是根据 Sphere
(私有(private)继承,不能解决您的问题)实现的,或者它有一个 Sphere
(组合,在这个简单的情况下可以解决您的问题)。但是,后一种情况可能会给移动复杂类带来问题,您希望 BoundingSphere
具有 Sphere
的所有方法。或者,您是否需要区分 BoundingVolumes
和普通的 Geometry
?
该问题的另一个解决方案是对这些层次结构之一使用非成员函数,Koenig 查找(参数的类型)调用正确的版本。我不能说不知道你的层次结构是什么样的。但是请考虑您的设计:如果您有同名操作返回完全不同的语义结果,操作是否正确命名/设计?
关于c++ - 一个类继承自两个类,具有相同的函数原型(prototype),相互冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10372992/