Drawing various types of shapes
Simulate single inheritance in c
  I wonder if my approach is good?


Function consistency

I'd expect ..._circle(Shape* this) functions to take Circle* this.  Let the draw() play with the pointer conversions.

void draw(void* this) {
  Shape* pthis = this;
  (pthis-&gt;pvtable-&gt;draw)(pthis);
}

void draw_circle(Circle* this) {
    printf("Drawing Circle with radius = %i\n",this-&gt;radius);
}

// No longer generate a warning
draw(mycircle);


Naming convention

For type Shape, code uses ..._shape, the undefined struct Shape and  Vtable.  I'd expect greater uniformity - perhaps Shape_init(), Shape_draw(), Shape_Vtable, etc.

For Circle, use Circle_draw(), Circle_init(), etc. and not ..._circle().

Avoid text case changes.

Avoid anonymous struct Shape

This problem hints that code is using C++ to compile C code.  Best to use C for C code. 

Change typedef void(*pfct)(struct Shape*); to typedef void(*pfct)(Shape*); and move after typedef struct{ ... }Shape;

Missing companion free()

A companion to ..._init(), a ..._uninit() should exist.

Organization

Put Shape code in one place (or file) and Circle in another.



Consider allocating to the object, not the type

It is easier to code right, review and maintain.

// pshape = malloc(sizeof(Shape));
pshape = malloc(sizeof *pshape);


Error checking

Robust code checks memory allocation.

pshape = malloc(sizeof(Shape));
if (pshape == NULL) Handle_OutOfMemory();