c++ - C++ 从两个相同的基类继承,如何将它的转换为它的中的一个

  显示原文与译文双语对照的内容

我有一个从两个相同的基础派生的类:


class Vector3d {...};


class Position:public Vector3d {...};


class Velocity:public Vector3d {...};



class Trajectory:public Position, public Velocity


{


 Vector3d &GetPosition(void);


 Vector3d &GetVelocity(void);


};



在派生类中,我希望有一个成员函数快速转换为一个或者另一个基。 我正在尝试的是:


Vector3d &GetPosition(void) const


{


 return static_cast<const Vector3d &>(*this);


}



但是我从编译器收到了一个消息: "使用'const位置'初始化,需要'vector 3d'类型的左值"

当我使用时:


const Vector3d &GetPosition(void) const


{


 return static_cast<const Vector3d &>(*this);


}



事情编译好,但我不能按照我的意愿使用它:


Trajectory t;


t.Position=Set(20,30,50);



因为 t.Position 是常量,因此左值不正确,因此编译器宣布。

关于如何将基类从非常数引用中引用的任何想法?

时间: 原作者:

你可以做


class Trajectory:public Position, public Velocity


{


public:


 Vector3d &GetPosition() { return static_cast<Position&>(*this); }


 Vector3d &GetVelocity() { return static_cast<Velocity&>(*this); }


};



演示工具

但是使用组合而不是继承似乎更合适。


class Trajectory


{


public:


 const Position& GetPosition() const { return position; }


 Position& GetPosition() { return position; }


 const Velocity& GetVelocity() const { return velocity; }


 Velocity& GetVelocity() { return velocity; }


private:


 Position position;


 Velocity velocity;


};



原作者:

我知道速度是矢量( v1,v2,v3 ),也是位置是 3d 空间( p1,p2,p3 ) 中的一点。 在轨迹中,一个点可以同时具有速度和位置,速度和位置都需要。 对于一件事,你不能使用虚拟继承。

我认为组合更有意义。


class Trajectory


{


 public:


 Position p;


 Velocity v;


 };



...