summaryrefslogtreecommitdiff
path: root/c,cc/ooc.c
blob: aa20488d7ef2de95a8a67278c0fe923d9568e843 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "ooc.h"
#include "stdio.h"
#include "string.h"


struct van {
       struct vehicle base;
          int cubic_size;
};

struct bus {
    struct vehicle base;
       int seats;
};

struct van*
make_van()
{
  struct van* v = malloc(sizeof(struct van));
  v->base.type = "van";
  v->cubic_size = 12;
  return v;
}

struct bus*
make_bus()
{
  struct bus* v = malloc(sizeof(struct bus));
  v->base.type = "bus";
  v->seats=112;
  return v;
}

struct vehicle*
make_vehicle(const char* type)
{
  if(!strcmp(type, "van")) return make_van();
  if(!strcmp(type, "bus")) return make_bus();
  return NULL;
}

void
do_something_with_a_bus(struct vehicle* v)
{
  ((struct bus*)v)->seats = 13;
}

void
do_something_with_a_van(struct vehicle* v)
{
  ((struct van*)v)->cubic_size = 11;
}

void
do_something(struct vehicle* v)
{
  if(!strcmp(v->type, "van")) return do_something_with_a_van(v);
  if(!strcmp(v->type, "bus")) return do_something_with_a_bus(v);
}

int
main(void) {
  struct van my_van;
  struct vehicle *something = &my_van;
  my_van.cubic_size = 100;
  my_van.base.power = 99;
  printf("%d\n", something->power);
  printf("%d\n", my_van.base.power);

  struct bus* bus = make_vehicle("bus");
  printf("%s\n", bus->base.type);
  printf("%d\n", bus->seats);
  do_something(bus);
  printf("%d\n", bus->seats);
 
  return 0;
}