From: Marcelo M. <mm...@ac...> - 2006-02-22 01:35:13
|
William S Fulton wrote: > William S Fulton wrote: > >> Gabe Plank wrote: >> >>> Hello- >>> >>> I have two base classes that contain the same virtual method. My >>> wrapper is complaining about multiple inheritance when I compile. >>> >>> As I understand, one can use %csmethodmodifiers to work around this >>> by renaming and/or re-scoping the method on one of the (less >>> important) base objects. Is this the correct tack in general, to >>> change the interface? Is there any sample code that addresses this >>> issue? >>> >> >> Can't think of any examples, but try searching through the >> Examples/test-suite directory. Otherwise here is one which makes the >> second derived class' method2() available to the derived class. >> >> %inline %{ >> struct Base1 { >> virtual ~Base1() {} >> virtual void method1() {} >> }; >> struct Base2 { >> virtual ~Base2() {} >> virtual void method2() {} >> }; >> struct Derived : public Base1, public Base2 {}; >> %} >> >> %csmethodmodifiers Derived::method2() "public virtual"; >> %extend Derived { >> void method2() { return self->method2(); } >> }; >> > > I was just thinking about this enquiry and improving matters for the > target languages that only support single inheritance. I was hoping > that the following %extend would work instead of the above %extend: > > %csmethodmodifiers Derived::method2() "public virtual"; > %extend Derived { > using Base2::method2; > }; > > But only the following is generated for the %extend (and the > %csmethodmodifiers feature is ignored): > > SWIGINTERN void Derived_method2(Derived *self){} > > If a 'using' is declared in %extend it would be nice if the following > was automatically generated: > > SWIGINTERN void Derived_method2(Derived *self){ > return self->Base2::method2(); > } > > Then as a further step we could create a feature that would then add > in %extend 'using' methods for for all the methods in all the base > classes that would have been ignored. the using + %extend is working now, about the adding the method for other base classes, you probably just need to copy/paste the code from lang.cc Language::unrollVirtualMethods to something like Language::unrollOtherMethods which does the same but whitout checking the 'virtual' part and only for 'other' methods found after skipping the first base class. The method will generate a 'mtable', ie, for multi-inheritance pseudo-support table instead of the 'vtable' generated for directors. Then, for languages that doesn't suppoert multi-inheritance natively, you could emit the 'mtable' methods similarly as the 'vtable' is emitted for directors. This should be easy to implement, but we need to wait for 1.3.29 to be out as usual. Marcelo > > Any thoughts? > > William > > > ------------------------------------------------------- > This SF.net email is sponsored by: Splunk Inc. Do you grep through log > files > for problems? Stop! Download the new AJAX search engine that makes > searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642 > _______________________________________________ > Swig-devel mailing list > Swi...@li... > https://lists.sourceforge.net/lists/listinfo/swig-devel |