gpt4 book ai didi

c++ - 一个类继承自两个类,具有相同的函数原型(prototype),相互冲突

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:19:18 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com