c++ - C++中的数据继承

标签 c++ inheritance polymorphism

我有两个类,一个用于存储基础数据,另一个用于存储附加数据,如下所示:

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_ptrstd::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/

相关文章:

c# - 类型转换为基类

c++ - 透明地将临时对象插入调用者的范围

c++ - std::is_trivially_equality_comparable_v<T>

javascript - 如何在 JavaScript 中获取所有类子级的列表?

c++ - 以自身为参数的抽象基类虚纯方法

java 继承多态方法 地下城怪物游戏

java - Java中的继承和多态

c++ - 对于多态类的对象,对象的地址和指向对象的指针是否相同?

C++ Primer 5th Edition 错误 bool 值没有指定最小大小?

c++ - 内存泄漏而不分配任何内存?