| // 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(); |
| } |
| %} |