summaryrefslogtreecommitdiff
path: root/Examples/test-suite/director_alternating.i
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/test-suite/director_alternating.i')
-rw-r--r--Examples/test-suite/director_alternating.i36
1 files changed, 36 insertions, 0 deletions
diff --git a/Examples/test-suite/director_alternating.i b/Examples/test-suite/director_alternating.i
new file mode 100644
index 000000000..6e3ef4f24
--- /dev/null
+++ b/Examples/test-suite/director_alternating.i
@@ -0,0 +1,36 @@
+// Checks if calls to a method being defined in the base class, not
+// overridden in the subclass, but again overridden in a class derived from
+// the first subclass are dispatched correctly.
+%module(directors="1") director_alternating;
+
+%feature("director") Foo;
+
+%inline %{
+struct Foo {
+ virtual ~Foo() {}
+ virtual int id() {
+ return 0;
+ }
+};
+
+struct Bar : Foo {};
+
+struct Baz : Bar {
+ virtual int id() {
+ return 2;
+ }
+};
+
+// Note that even though the return value is of type Bar*, it really points to
+// an instance of Baz (in which id() has been overridden).
+Bar *getBar() {
+ static Baz baz;
+ return &baz;
+}
+
+// idFromGetBar() obviously is equivalent to getBar()->id() in C++ – this
+// should be true from the target language as well.
+int idFromGetBar() {
+ return getBar()->id();
+}
+%}