在两个相同基类的多重继承中,如何将其转换为其中一个

时间:2016-12-22 00:26:26

标签: c++ inheritance this const

我有一个来自两个相同基础的类:

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,因此是一个不合适的左值,正如编译器宣布的那样。

关于如何将基类引入非常量解除引用的任何想法?

2 个答案:

答案 0 :(得分:5)

你可以做

class Trajectory:public Position, public Velocity
{
public:
    Vector3d &GetPosition() { return static_cast<Position&>(*this); }
    Vector3d &GetVelocity() { return static_cast<Velocity&>(*this); }
};

Demo

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

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;
 };