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);
+}
+
+#define SOD_DECL(cls_, var_) \
+ struct cls_##__ilayout var_##__layout; \
+ cls_ *var_ = cls_##__class->cls.init(&var_##__layout)
+
+int main(void)
+{
+ {
+ SOD_DECL(Lion, l);
+ provoke_lion(l);
+ tickle_animal(LION__CONV_NML(l));
+ }
+
+ {
+ SOD_DECL(Goat, g);
+ provoke_goat(g);
+ tickle_animal(GOAT__CONV_NML(g));
+ }
+
+ {
+ SOD_DECL(Serpent, s);
+ provoke_serpent(s);
+ tickle_animal(SERPENT__CONV_NML(s));
+ }
+
+ {
+ SOD_DECL(Chimaera, c);
+ 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);
+}
+
+}