libuv句柄有一个void*data
字段来承载任何上下文信息(在C-land中非常标准的回调模式)。 但是,由于我在C++-land中工作,我想使用继承直接将上下文存储在句柄中。 它的主要优点是存储多个上下文项,IIUC需要堆分配将它们“组合”到一个指针中,例如std::tuple<...>*
或一些临时结构(如果我在这里说错了请纠正我,即使在C-land中我也可以避免堆分配)。
我的主要担心是:
那么,我可以在C++中安全地从libuv句柄继承吗? 如果你能澄清以上几点,你就会得到额外的分数。
如果您自己分配句柄,然后将它们传递给libuv,那么没有什么可以阻止您继承它们。 您可以任意分配它们。 你可以让他们成为你的类的成员,但是你也可以让他们成为你的类的基础。
编译器不能仅仅因为libuv句柄是基类就更改它的内存布局。 允许它决定基础在整个类结构中的位置,但不允许改变基础本身。 (否则,指向基类的指针必须以不同的方式工作,这取决于您分配的是基类的实例还是派生类的实例!)
因为编译器不能改变内存布局,所以libuv所做的一切都是无关紧要的。 如果它与普通的libuv句柄对象一起工作,那么当它们被用作基类时,它仍然可以工作。
注意:如果从libuv句柄继承仍然让您不舒服,您可以将该句柄分配为您的类的成员,并在libuv的“context”字段中存储指向整个类的指针。