我正在处理光线追踪任务,这是有问题的来源:

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/

10-09 00:23