问题描述:我有一个类C从混入继承A和B.我想要一个新类,C_具有在类中定义的所有方法/属性,C但在继承方案中B与B_(相同的API)交换(一种可能的用法是容易模拟).所有课程都是新式课程.
通过搞乱继承顺序,我得到了我想要的东西,因此MRO:
A B B_ B_ A B
\ / / \ \ /
C / \ C
\ / \ /
C1 C2
C1(C,B_) C2(B_,C)
C1.__mro__ = (C1, C , A, B, B_, object)
C2.__mro__ = (C2, B_, C, A, B , object)
Run Code Online (Sandbox Code Playgroud)
的C2方法(继承之前改性混入C类)工作而不会太大的惊喜和,如果我呼叫在所定义的方法B混入时,B_被选择的定义.
目前它有效,但我觉得:"手指交叉,我希望不会出现特殊情况并破坏系统!"
问题是:它是一种解决问题的最终解决方案,还是有更好的方法?
PS:我想我可以带上我的火箭筒并创建一个元类来重新定义mro(正如官方文档中所述),但我的直觉说它不一定更漂亮.
我有一个简单的结构,我想在堆上初始化并作为函数中的指针返回。
struct entry {
const char* const key; // We don't want the key modified in any way
const void* data; // But the pointer to data can change
struct entry* next;
};
Run Code Online (Sandbox Code Playgroud)
有一个问题,我不能calloc一一初始化成员,因为它key是一个常量指针。我在某处找到了这种有效的语法:
struct entry* entry = calloc(1, sizeof(struct entry));
*entry = (struct entry) { .key = key, .data = data, .next = NULL };
Run Code Online (Sandbox Code Playgroud)
但我不知道它发生了什么:它是否创建了一个“匿名”结构,然后将其复制到*entry居住的地方?这是否安全使用,还是我应该更喜欢创建一个本地结构,然后将其复制memcpy到正确的位置?