我有一个派生自两个相同基础的类:
class Vector3d {...};
class Position:public Vector3d {...};
class Velocity:public Vector3d {...};
class Trajectory:public Position, public Velocity
{
Vector3d &GetPosition(void);
Vector3d &GetVelocity(void);
};
Run Code Online (Sandbox Code Playgroud)
我想在派生类中有一个成员函数来快速转换为一个或另一个基类.我在想的是:
Vector3d &GetPosition(void) const
{
return static_cast<const Vector3d &>(*this);
}
Run Code Online (Sandbox Code Playgroud)
但我从编译器收到一条消息:"用'const Position'初始化的引用,需要'Vector3d'类型的左值"
我用的时候:
const Vector3d &GetPosition(void) const
{
return static_cast<const Vector3d &>(*this);
}
Run Code Online (Sandbox Code Playgroud)
事情编译好,但我不能以我想要的方式使用它:
Trajectory t;
t.Position=Set(20,30,50);
Run Code Online (Sandbox Code Playgroud)
因为t.Position是const,因此是一个不合适的左值,正如编译器宣布的那样.
关于如何将基类引入非常量解除引用的任何想法?
你可能会这样做
class Trajectory:public Position, public Velocity
{
public:
Vector3d &GetPosition() { return static_cast<Position&>(*this); }
Vector3d &GetVelocity() { return static_cast<Velocity&>(*this); }
};
Run Code Online (Sandbox Code Playgroud)
但使用组合而不是继承似乎更合适.
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;
};
Run Code Online (Sandbox Code Playgroud)