class Chimaera : Lion, Goat, Serpent {
}
+code c : user [classes end, user, epilogue] {
+/*----- Main driver code --------------------------------------------------*/
+
+static void tickle_animal(Animal *a)
+{
+ int i;
+
+ for (i = 0; i < 3; i++) {
+ printf("tickle %s #%d...\n", a->_vt->_class->cls.name, i);
+ a->_vt->nml.tickle(a);
+ }
+}
+
+static void provoke_lion(Lion *l)
+{
+ printf("provoking %s as a lion\n", l->_vt->_class->cls.name);
+ l->_vt->lion.bite(l);
+}
+
+static void provoke_goat(Goat *g)
+{
+ printf("provoking %s as a goat\n", g->_vt->_class->cls.name);
+ g->_vt->goat.butt(g);
+}
+
+static void provoke_serpent(Serpent *s)
+{
+ printf("provoking %s as a serpent\n", s->_vt->_class->cls.name);
+ s->_vt->serpent.bite(s);
+}
+
+int main(void)
+{
+ {
+ struct Lion__ilayout ll;
+ Lion *l = Lion__class->cls.init(&ll);
+ provoke_lion(l);
+ tickle_animal(LION__CONV_NML(l));
+ }
+
+ {
+ struct Goat__ilayout gg;
+ Goat *g = Goat__class->cls.init(&gg);
+ provoke_goat(g);
+ tickle_animal(GOAT__CONV_NML(g));
+ }
+
+ {
+ struct Serpent__ilayout ss;
+ Serpent *s = Serpent__class->cls.init(&ss);
+ provoke_serpent(s);
+ tickle_animal(SERPENT__CONV_NML(s));
+ }
+
+ {
+ struct Chimaera__ilayout cc;
+ Chimaera *c = Chimaera__class->cls.init(&cc);
+ provoke_lion(CHIMAERA__CONV_LION(c));
+ provoke_goat(CHIMAERA__CONV_GOAT(c));
+ provoke_serpent(CHIMAERA__CONV_SERPENT(c));
+ tickle_animal(CHIMAERA__CONV_NML(c));
+ }
+
+ return (0);
+}
+
+}