diff options
Diffstat (limited to 'Examples/test-suite/director_alternating.i')
-rw-r--r-- | Examples/test-suite/director_alternating.i | 36 |
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(); +} +%} |