+class Chimaera: Lion, Goat, Serpent {
+ serpent.limit = 1;
+}
+
+code c: user {
+/*----- 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);
+ Animal_tickle(a);
+ }
+}
+
+static void provoke_lion(Lion *l)
+{
+ printf("provoking %s as a lion\n", l->_vt->_class->cls.name);
+ Lion_bite(l);
+}
+
+static void provoke_goat(Goat *g)
+{
+ printf("provoking %s as a goat\n", g->_vt->_class->cls.name);
+ Goat_butt(g);
+}
+
+static void provoke_serpent(Serpent *s)
+{
+ printf("provoking %s as a serpent\n", s->_vt->_class->cls.name);
+ Serpent_bite(s);
+}
+
+int main(void)
+{
+ {
+ SOD_DECL(Lion, l, NO_KWARGS);
+ provoke_lion(l);
+ tickle_animal(LION__CONV_NML(l));
+ }
+
+ {
+ SOD_DECL(Goat, g, NO_KWARGS);
+ provoke_goat(g);
+ tickle_animal(GOAT__CONV_NML(g));
+ }
+
+ {
+ SOD_DECL(Serpent, s, NO_KWARGS);
+ provoke_serpent(s);
+ tickle_animal(SERPENT__CONV_NML(s));
+ }
+
+ {
+ SOD_DECL(Chimaera, c, NO_KWARGS);
+ 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);