从基类型向量访问派生成员

时间:2011-04-01 06:10:30

标签: c++ inheritance base derived

说我有这样的情况:

class Vertex
{
public:
    Position position;
    Normal   normal;
    Texcoord texcoord;
    int      boneID;
};

class VertexSkinned: public Vertex
{
public:
    float boneWeights[3];
    int   boneIDs[3];
};

class VertexMorphed: public Vertex
{
public:
    Position posTargets[3];
    Normal   normTargets[3];
    Texcoord texcoordTargets[3];
};

std::vector<Vertex> vertices;

VertexSkinned vs;
VertexMorphed vm;
Vertex        v;

vertices.push_back( vs );
vertices.push_back( vm );
vertices.push_back( v );

// This is illegal right? But how would I go about achieving the desired effect
float someFloat = vertices.front().boneWeights[2];

问题出在评论中。我很少使用继承,并认为我可能在这里找到了有益的用途,尽管它似乎不可能。

我假设使用指针向量然后动态转换为派生类有效吗?这不是我想做的事。

3 个答案:

答案 0 :(得分:2)

你有切片问题。 sizeof(VertexSkinned)和sizeof(VertexMorphed)与sizeof(Vertex)不相等,无法插入数组中。改为使用指针

要访问派生类的成员,首先必须确定指定的项是否为派生类型。一个选项是在Base中添加一个GetType函数或使用dynamic_cast

答案 1 :(得分:0)

我没有看到除了存储指针和dynamic_cast之外的任何其他选项以获取派生对象。如果你想做类似的事情,你不能拥有3个不同的向量,每个向量都有自己的类型。在这种情况下,不需要指针业务。

答案 2 :(得分:0)

当你有一个顶点数组时,我认为数组中的所有顶点都是相同的类型,这意味着存储指针并执行dynamic_cast是浪费时间。当您知道数组中的每个顶点都保证为VertexSkinned时,您也应该能够使用更快的static_cast

存储指向各个顶点的指针可能对性能不利,因为它们不会存储在一个连续的内存块中。