我有两个类,一个用于存储基础数据,另一个用于存储附加数据,如下所示:
struct AnimationState(){
virtual ~ AnimationState(){};
Vector3f m_spacialData;
float m_fTimeStamp;
}
派生类:
struct HermiteAnimationState() : public AnimationState{
virtual ~HermiteAnimationState(){};
Vector3f m_tangentIn;
Vector3f m_tangentOut;
}
我的问题: 是如何首先创建一个 HermiteAnimationState 的实例,然后将其上传到 AnimationState 以存储在像这样的 vector :
std::vector<AnimationState> m_vStates;
...
最近,我可以获得对象 AnimationState 并将其向下转换为 HermiteAnimationState 以访问附加数据(成员 m_tangentIn 和 m_tangentOut)。
HermiteAnimationState* p = dynamic_cast<HermiteAnimationState*>(&m_vStates[i])
最佳答案
多态性在 C++ 中的工作方式是,如果 B
是基类并且 D
派生自 B
,则:
- 可以在需要指向
B
的地方使用指向D
的指针 - 可以在需要引用
B
的地方使用对D
的引用
您在 C++ 中不能做的实际上是在 值 类型 B
是预期的。例如,您不能将派生对象存储在基对象数组中。当您认为派生对象的大小可能与基础对象的大小不同时,这是有道理的。
同样,您不能将派生对象存储在基础对象的 vector 中。
您可以做的是将指向 HermiteAnimationState
的指针存储在指向 AnimationState 的指针 vector 中
。如何管理内存取决于您。例如,以下是有效的:
std::vector<AnimationState*> m_vStates;
HermiteAnimationState h_a_s;
m_vStates.push_back(&h_a_s);
...
HermiteAnimationState* p = dynamic_cast<HermiteAnimationState*>(m_vStates[i])
因为 h_a_s
是一个局部变量,它会在其范围结束时自动销毁。
但这可能是一种行不通的方法,因为您可能希望 vector 元素引用的对象在当前范围之外持续存在。为此,我们可以使用 std::unique_ptr
。 std::unique_ptr
拥有它指向的对象,只要它还活着,那个对象也是如此;并在对象本身被销毁时删除该对象。因此,就内存管理而言,std::unique_ptr
对象的 vector 表现得像对象本身的 vector 。现在你可以做
std::vector<std::unique_ptr<AnimationState*>> m_vStates;
m_vStates.emplace_back(new HermiteAnimationState);
...
HermiteAnimationState* p =
dynamic_cast<HermiteAnimationState*>(m_vStates[i].get());
(但是请注意,您无法复制此 vector ;您只能移动它。)
关于c++ - C++中的数据继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21568245/