2

假设我有这样的情况:

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

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

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

4

3 回答 3

2

你有一个切片问题。sizeof(VertexSkinned) 和 sizeof(VertexMorphed) 与 sizeof(Vertex) 不相等,不能插入到数组中。改用指针

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

于 2011-04-01T06:13:03.823 回答
0

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

于 2011-04-01T06:15:11.163 回答
0

当你有一个顶点数组时,我想数组中的所有顶点都是相同的类型,这意味着存储指针和做 adynamic_cast是浪费时间。当您知道数组中的每个 Vertex 都保证为 aVertexSkinned时,您还应该能够使用更快的static_cast

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

于 2011-04-01T06:36:55.173 回答