C++ C++;过载分辨率

C++ C++;过载分辨率,c++,inheritance,C++,Inheritance,我想使用继承来根据对象在层次结构中的位置以不同的方式处理它 () 假设您构建了形状对象的层次结构,如: class Shape {} ; class Sphere : public Shape {} ; class Triangle : public Shape {} ; ... 然后,您可以为一个Ray类配备如下方法: class Ray { Intersection intersects( const Sphere * s ) ; Intersection intersec

我想使用继承来根据对象在层次结构中的位置以不同的方式处理它

()

假设您构建了形状对象的层次结构,如:

class Shape {} ;
class Sphere : public Shape {} ;
class Triangle : public Shape {} ; ...
然后,您可以为一个Ray类配备如下方法:

class Ray
{
    Intersection intersects( const Sphere * s ) ;
    Intersection intersects( const Triangle * t ) ;
};
存储各种类型的组合形状*数组并调用

vector<Shape*> shapes ; ...
//foreach shape..
Intersection int = ray.intersects( shapes[ i ] )
那么每个类覆盖相交?然后打电话给

//foreach shape..
Intersection int = shapes[i]->intersects( ray ) ;

你能按照我展示的第一种方式来做吗?还是永远不做?

你必须用另一种方式来做。重载解析发生在编译时,当您调用它的类型是
形状*

不,您不能用第一种方法。C++中的过载解决方案是基于函数参数的静态类型。它在编译时解析。在您的示例中,静态类型是
Shape*
,并且类中没有接受
Shape*
的函数(因此出现错误)。编译器并不关心指针在运行时是否实际指向
球体

要实现您试图实现的功能,您必须通过依赖于对象动态类型的工具来“引导”您的调用,即通过虚拟函数调用,这就是您在第二个示例中所做的

您的第二个示例稍微简化了一点,因为所涉及的一个对象的类型在编译时是已知的(
Ray
)。在更复杂的情况下,“交叉点”中涉及的两个对象都可以是动态类型。如果你想处理这样的事情,你可以使用所谓的“双重分派”技术(搜索)。

也许你可以用RTTI信息来拉这个。我还没做过,但这可能是可能的

class Ray
{
    Intersection intersects( const Sphere * s ) ;
    Intersection intersects( const Triangle * t ) ;
    Intersection intersects( const Shape * s ) {
       //act on RTTI info, or 
       //use dynamic_cast to other types and check if the result is NULL or not
    }
};

我想那是个好主意。C++没有原生不动。是的,我知道关于代码>类型()/<代码>,但是我当然不想使用它,答案几乎是肯定的。
class Ray
{
    Intersection intersects( const Sphere * s ) ;
    Intersection intersects( const Triangle * t ) ;
    Intersection intersects( const Shape * s ) {
       //act on RTTI info, or 
       //use dynamic_cast to other types and check if the result is NULL or not
    }
};