Учитывая неопределенность в поддержке, я бы использовал это только в экспериментальном коде или в качестве учебного занятия, если только у меня не было гарантий от реализации 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 также должен быть первым членом. Как избежать их обоих?

Ответы на вопрос(1)

Ваш ответ на вопрос