Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从基类型的向量访问派生成员_C++_Inheritance_Base_Derived - Fatal编程技术网

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在这里指出的那样,它只复制派生类的基部分。务实的考虑从一开始就被排除在外,因为这个想法是错误的。这是一个纯粹的理论问题。