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