我有一个来自两个相同基础的类:
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);
}
但是我收到了来自编译器的好消息:&#34;用&#39; const Position&#39;初始化的参考,需要左右类型&#39; Vector3d&#39;&#34;
当我使用时:
const Vector3d &GetPosition(void) const
{
return static_cast<const Vector3d &>(*this);
}
事情编译好,但我不能按照我想要的方式使用它:
Trajectory t;
t.Position=Set(20,30,50);
因为t.Position是const,因此是一个不合适的左值,正如编译器宣布的那样。
关于如何将基类引入非常量解除引用的任何想法?
答案 0 :(得分:5)
你可以做
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;
};
答案 1 :(得分:3)
我理解速度是矢量(v1,v2,v3),位置也是3d空间中的点(p1,p2,p3)。 现在在轨迹中,一个点可以同时具有速度和位置,速度和位置。首先,你不能使用虚拟继承。
我认为构图更有意义。
class Trajectory
{
public:
Position p;
Velocity v;
};