C++ 从基类型的向量访问派生成员
假设我遇到这样的情况:C++ 从基类型的向量访问派生成员,c++,inheritance,base,derived,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: publi
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];
类顶点
{
公众:
位置;
正常正常;
特克斯库德;
内特博奈德;
};
类VertexSkinned:公共顶点
{
公众:
浮动骨灯[3];
int-boneIDs[3];
};
类VertexMorphed:公共顶点
{
公众:
定位后目标[3];
正常指标[3];
Texcoord texcoordTargets[3];
};
向量顶点;
顶点皮肤vs;
顶点变形vm;
顶点v;
顶点。推回(vs);
顶点。推回(vm);
顶点。推回(v);
//这是违法的,对吗?但我如何才能达到预期的效果呢
float someFloat=vertices.front().boneWeights[2];
问题在评论中。我很少使用继承,我想我可能在这里找到了一个有益的用途,尽管这似乎不可能
我假设使用一个指针向量,然后对派生类进行动态强制转换有效吗?但这不是我想做的。您有一个切片问题。sizeof(顶点蒙皮)和sizeof(顶点变形)与sizeof(顶点)不相等,因此无法插入到数组中。用指针代替
要访问派生类的成员,首先必须确定指定项是否为派生类型。一个选项是在Base中添加一个GetType函数,或者使用dynamic_cast,我看不到任何其他选项,除了存储指针和以后的dynamic_cast来获取派生对象。如果你想做这样的事情,你不能有3个不同的向量,每个向量都有自己的类型。在这种情况下,不需要指针业务。当您有一个顶点数组时,我假设数组中的所有顶点都是同一类型的,这意味着存储指针和执行
动态转换是浪费时间。当您知道阵列中的每个顶点都是保证的,比如说一个顶点蒙皮
,您还应该能够使用更快的静态施法
存储指向单个顶点的指针可能对性能不利,因为它们不会存储在一个连续的内存块中。向量不是数组,根据VS2010 intellisense,它们将接受派生类(我猜它们在推操作中执行某种类型的强制转换,或者intellisense是错误的)。我知道这种事情在指针上是可能的——我只是想知道,如果没有指针,我是否可以做类似的事情。你不知道项目的类型。要访问boneWeights,您必须了解如何转换为VertexSkinned。如果您可以为boneWeights设置一些默认值(如果从VertexSkinned或Vertex对象请求),那么您可以使用虚拟函数并对Vertex对象进行所有调用否,如果没有它们,您肯定无法执行任何类似的操作。push_back将接受派生类,但正如cprogrammer在这里指出的那样,它只复制派生类的基部分。务实的考虑从一开始就被排除在外,因为这个想法是错误的。这是一个纯粹的理论问题。