一个继承自两个类的类,具有相同的函数原型,相互冲突

时间:2012-04-29 14:38:29

标签: c++ inheritance

我正在处理Ray Tracing任务,这是有问题的来源:

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。但是由于继承了具有不同返回类型的相同参数列表的函数,事情搞砸了......

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

1 个答案:

答案 0 :(得分:1)

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

如果您认为这些名称最能代表他们所提供的行动的意义(我不确定),我还建议您仔细考虑您的等级制度。球形BoundingVolume真的是Sphere吗?也许不是:它是用Sphere(私有继承,不解决你的问题)实现的,或者它有一个Sphere(组合,在这个简单的情况下会解决你的问题)。但是,后一种情况可能会给移动复杂类带来问题,您希望BoundingSphere拥有Sphere的所有方法。或者,您是否需要区分BoundingVolumes和普通Geometry

该问题的另一个解决方案是对其中一个层次结构使用非成员函数,使用Koenig查找(参数的类型)调用正确的版本。我不能不知道你的等级制度是什么样子。但要考虑一下你的设计:如果你有同名的操作给你回到完全不同的语义结果,那么操作是否正确命名/设计?