C ++有没有办法模拟子类和父类之间的联合行为?

时间:2015-12-03 16:18:55

标签: c++ inheritance unions

有没有办法模拟联合行为?请参阅以下代码:

// this is ideal interface, which I would like to simulate
struct IdealInterface{
  union{
    struct{float r,g,b;};
    struct{float x,y,z;};
  };
};

// this is real parent object I should not change
struct Parent{
  float r, g, b;
};

// this interface has ok behavior,
// but sizeof(Child0) != sizeof(Parent)
// which causes problems
struct Child0:public Parent{
  float & x, & y, & z;
  Child0() : Parent(), x(r), y(g), z(b){ };
};

// this has ok size, but interface is different
struct Child1:public Parent{
  float & x(){ return r; }
  float & y(){ return g; }
  float & z(){ return b; }
};

如上所述,我应该保留Parent类,我应该从Parent派生我的子类。我不应该创建不同的类型并使用类型转换。因此,是否可以使用与IdealInterface类相同的接口创建派生类(表单Parent)?

2 个答案:

答案 0 :(得分:1)

<强>答案:

首先,我有一些评论员的话。我问了一个非常直接的问题。我得到了什么?例如关于sizeof属性的答案,没有提出(顺便说一句,是的,在这种情况下我保证sizeof - 这是c ++,而不是今天常见的野生语言)。

为什么我不能使用IdealInterface。问题更复杂。我想用引入的约束和依赖项编辑更大的代码包。因此,这是一个问题,我无法重新定义问题,但这意味着更简单的解决方案。

答案:,这是不可能的。

为什么呢?它基于匿名结构和联合的属性。

最近的方法:就我的目的而言,最近的方法是使用内存模型作为参数。

struct BASIC_MEMORY_MODEL{
    float x, y, z;
    BASIC_MEMORY_MODEL() :x(), y(), z(){}
};

struct ADVANCED_MEMORY_MODEL{
    union{
        struct { float x, y, z; };
        struct { float r, g, b; };
    };
    ADVANCED_MEMORY_MODEL() :x(), y(), z(){}
};

template<typename MEMORY_MODEL = BASIC_MEMORY_MODEL>
struct ParentBase : public MEMORY_MODEL{};

typedef ParentBase<> Parent;

struct Child : public ParentBase < ADVANCED_MEMORY_MODEL > {};

答案 1 :(得分:0)

如果您的行为与union相同,则表示相同,但​​不是实际使用union

您可以随时隐藏基础数据:

class Vertex
{

 Vertex();
 Vertex(float,float,float);

 float& x() { return r;}
 float& y() { return g;}
 float& z() { return b;}
 float& r() { return r;}
 float& g() { return g;}
 float& b() { return b;}

 void r(float rComponent) { this->r = rComponent; }
 ...

 private:
   float r, g, b;
}

然而,这种方法的缺点是你必须调用方法而不是像使用union那样访问底层变量。

如果你想:

Vertex v;
v.x = 1.0f

然后你会想要使用一个联盟。