Advertisement
elvman

virtual functions in C

Mar 20th, 2018
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.02 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. typedef struct Class
  4. {
  5.     const struct Class* parent;
  6.     void (*virtualPrint)(void*);
  7. } Class;
  8.  
  9. typedef struct A
  10. {
  11.     const Class* class;
  12.     int a;
  13. } A;
  14.  
  15. typedef struct B
  16. {
  17.     const Class* class;
  18.     A a;
  19.     int b;
  20. } B;
  21.  
  22. static const Class* getClass(void* this)
  23. {
  24.     return *(Class**)this;
  25. }
  26.  
  27. static void virtualPrintA(void* this)
  28. {
  29.     A* a = this;
  30.     printf("virtualPrintA: %d\n", a->a);
  31. }
  32.  
  33. static void virtualPrintB(void* this)
  34. {
  35.     B* b = this;
  36.     getClass(&b->a)->virtualPrint(&b->a);
  37.  
  38.     printf("virtualPrintB: %d\n", b->b);
  39. }
  40.  
  41. static const Class aClass = {.parent = NULL, .virtualPrint = virtualPrintA};
  42. static const Class bClass = {.parent = &aClass, .virtualPrint = virtualPrintB};
  43.  
  44. int main()
  45. {
  46.     A a = {.class = &aClass, .a = 1};
  47.     B b = {.class = &bClass, .a = {.class = &aClass, .a = 2}, .b = 3};
  48.     A* c = (A*)&b;
  49.  
  50.     getClass(&a)->virtualPrint(&a);
  51.     getClass(&b)->virtualPrint(&b);
  52.     getClass(c)->virtualPrint(c);
  53.  
  54.     return 0;
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement