Учитывая неопределенность в поддержке, я бы использовал это только в экспериментальном коде или в качестве учебного занятия, если только у меня не было гарантий от реализации C, которую я использовал, что эта арифметика указателей поддерживается. Было бы предпочтительнее придерживаться основы в качестве первого элемента, поскольку эти преобразования строго соответствуют C.
аюсь смоделировать полиморфизм C ++ в C с помощью следующего кода:
#include<stdio.h>
typedef struct Base {
void (*out) (void);
} Base;
typedef struct Derived {
Base base;
int x;
} Derived;
void base_out() {
printf("base\n");
}
void derived_out() {
printf("derived\n");
}
void foo(void) {
Derived d;
Base b;
b.out = base_out;
d.base.out = derived_out;
Base *p;
p = &b;
p->out();
//warning: assignment from incompatible pointer type
p = &d;
p->out();
}
int main(void) {
foo();
}
Но я должен сделать несовместимое назначение указателя, когдаp = &d
, И чтобы это работало,base
член вDerived
также должен быть первым членом. Как избежать их обоих?