C++ 继承以及如何通过父类(super class)传递和维护子类数据

标签 c++ inheritance polymorphism

好吧,不太确定如何表达这个问题,也找不到任何我认为真正解决这种情况的重复项。

本质上,我有一个父类(super class),它通过子类向其附加额外的数据。该数据的容器类仅识别父类(super class),并根据父类(super class)中的 id 参数调整特性。

实际上,直到最近我才不得不在 C++ 中使用继承,所以如果这是微不足道的,请原谅我。我的印象是,当我使用父类(super class)硬复制一堆数据时,子类数据可以说在翻译中丢失了。为了绕过这个限制,我尝试使用类型转换的指针,但是现在,即使在 free() 函数中类型转换指针参数时,尝试释放内存时也会出现段错误。

这是示例代码...

结构体

// Super class
struct Vertex {
    __declspec(align(4)) unsigned int vType;              // Identifies the vertex type.

    Vertex(const unsigned int _vType) : vType(_vType) { }
    Vertex(const Vertex &_rV) : vType(_rV.vType) { }      // Copy constructor
    virtual ~Vertex() { }

    unsigned int GetVType() const { return vType; }
};

// Subclass
// Id = 1
struct V_Pos : Vertex {
    __declspec(align(4)) XMFLOAT3 position;

    V_Pos(void) : Vertex(1) { }
    V_Pos(XMFLOAT3 &_rPosition) : Vertex(1), position(_rPosition) { }
    V_Pos(const V_Pos &_rV) : Vertex(_rV), position(_rV.GetPosition()) { } // Copy constructor
    ~V_Pos() { }

    XMFLOAT3 GetPosition() const { return position; }
};

以下是我当前复制数据的方式。

// pBuffer is declared as a Vertex* data type
pBuffer = new V_Pos[_bufSize];

if (_pVBuffer->GetVType() == 1)
    for (unsigned int i = 0; i < bufSize; ++i) {
        V_Pos *_temp = (V_Pos*)&_pVBuffer[i];
        pBuffer[i] = *_temp;
    }

以下是我目前解除数据分配的方式。

if (pBuffer != 0) {
    delete [] pBuffer;
    pBuffer = 0;
}

针对这种情况,正确的做法是什么?

编辑 1 -

更新了上述代码块以澄清 knulp 答案下的评论讨论。

最佳答案

如果你开始将低级内存分配与 malloc()/free() 和 C++ 对象混合在一起,你会遇到很多麻烦,同时使你的代码几乎不可读。

您应该在适当的构造函数上使用 new 创建一个新对象,它会自动 1) 分配内存并 2) 初始化结构。要正确释放内存,您应该使用删除和析构函数。

您应该使用复制构造函数和赋值运算符进行复制。如果您没有定义它们,编译器会自动定义默认值来执行按位复制。

为什么要使用类型字段? C++ 具有非常强大的类型功能,因此绕过所有 C++ 机制来定义 vType 意义不大。相反,定义一个基类,以及两个或多个从中派生的类,然后消除 vtype 字段。

如果您使用干净的面向对象编程,您将从一开始就避免所有这些问题。

关于C++ 继承以及如何通过父类(super class)传递和维护子类数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6684630/

相关文章:

c++ - 链接列表的成员值意外更改

C++ 制作通用接口(interface)

java - 如何将数组与多态性一起使用?

c++ - 在 C++ 中创建实例的内存分配

c++ - #包括任何地方

Java - 用不同的方法实现两个接口(interface)

c# - 有没有办法在子类中部分隐藏方法?

c++ - 使用列表对象内部对象的派生函数

haskell - 在 Haskell 中复制 Numpy 的高级索引/切片

c# - 来自 C++ COM 的 C# 字符串