说我有这样的情况:
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];
问题出在评论中。我很少使用继承,并认为我可能在这里找到了有益的用途,尽管它似乎不可能。
我假设使用指针向量然后动态转换为派生类有效吗?这不是我想做的事。
答案 0 :(得分:2)
你有切片问题。 sizeof(VertexSkinned)和sizeof(VertexMorphed)与sizeof(Vertex)不相等,无法插入数组中。改为使用指针
要访问派生类的成员,首先必须确定指定的项是否为派生类型。一个选项是在Base中添加一个GetType函数或使用dynamic_cast
答案 1 :(得分:0)
我没有看到除了存储指针和dynamic_cast之外的任何其他选项以获取派生对象。如果你想做类似的事情,你不能拥有3个不同的向量,每个向量都有自己的类型。在这种情况下,不需要指针业务。
答案 2 :(得分:0)
当你有一个顶点数组时,我认为数组中的所有顶点都是相同的类型,这意味着存储指针并执行dynamic_cast
是浪费时间。当您知道数组中的每个顶点都保证为VertexSkinned
时,您也应该能够使用更快的static_cast
。
存储指向各个顶点的指针可能对性能不利,因为它们不会存储在一个连续的内存块中。