So I have 2 classes, foo and bar. bar is a subclass of foo. Both bar and foo have virtual functions intended to be overridden form python.<br><br>struct foo<br>{<br>&nbsp;&nbsp;&nbsp; foo(){} ;<br>&nbsp;&nbsp;&nbsp; foo(int init_x, int init_y){x=init_x;y=init_y;};<br>
&nbsp;&nbsp;&nbsp; int x;<br>&nbsp;&nbsp;&nbsp; int y;<br><br>&nbsp;&nbsp;&nbsp; virtual void FooCallback(){std::cout &lt;&lt; &quot;default foo called&quot; &lt;&lt; std::endl;};<br>};<br><br>struct bar : foo<br>{<br>&nbsp;&nbsp;&nbsp; bar(){} ;<br>&nbsp;&nbsp;&nbsp; bar(int init_x, int init_y, int init_z):foo(init_x,init_y){z = init_z;};<br>
<br>&nbsp;&nbsp;&nbsp; virtual void BarCallback(){std::cout &lt;&lt; &quot;default bar called&quot; &lt;&lt; std::endl;};<br><br>&nbsp;&nbsp;&nbsp; int z;<br>};<br><br>struct foo_wrapper : foo , wrapper&lt;foo&gt;<br>{<br>&nbsp;&nbsp;&nbsp; foo_wrapper();<br>&nbsp;&nbsp;&nbsp; foo_wrapper(const foo&amp; f);<br>
&nbsp;&nbsp;&nbsp; foo_wrapper(int init_x, int init_y);<br><br>&nbsp;&nbsp;&nbsp; virtual void FooCallback();<br>};<br><br>void foo_wrapper::FooCallback()<br>{<br>&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;atemptting foo callback&quot; &lt;&lt; std::endl;&nbsp; <br>&nbsp;&nbsp;&nbsp; if (override func = this-&gt;get_override(&quot;FooCallback&quot;))<br>
&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; func();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;foo callback function not found&quot; &lt;&lt; std::endl;<br>}<br><br>foo_wrapper::foo_wrapper(const foo&amp; exch): foo(exch), wrapper&lt;foo&gt;(){}<br>
foo_wrapper::foo_wrapper(): foo(), wrapper&lt;foo&gt;(){}<br>foo_wrapper::foo_wrapper(int init_x, int init_y) : foo(init_x,init_y), wrapper&lt;foo&gt;(){}<br><br>struct bar_wrapper: bar, wrapper&lt;bar&gt;<br>{<br>&nbsp;&nbsp;&nbsp; bar_wrapper();<br>
&nbsp;&nbsp;&nbsp; bar_wrapper(const bar&amp; b);<br>&nbsp;&nbsp;&nbsp; bar_wrapper(int init_x, int init_y, int init_z);<br><br>&nbsp;&nbsp;&nbsp; virtual void BarCallback();<br>};<br><br>bar_wrapper::bar_wrapper(const bar&amp; exch): bar(exch), wrapper&lt;bar&gt;(){}<br>
bar_wrapper::bar_wrapper(): bar(), wrapper&lt;bar&gt;(){}<br>bar_wrapper::bar_wrapper(int init_x, int init_y, int init_z) : bar(init_x, init_y, init_z), wrapper&lt;bar&gt;(){}<br><br>void bar_wrapper::BarCallback()<br>{<br>
&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;atemptting bar callback&quot; &lt;&lt; std::endl;&nbsp; <br>&nbsp;&nbsp;&nbsp; if (override func = this-&gt;get_override(&quot;BarCallback&quot;))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; func();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;bar callback function not found&quot; &lt;&lt; std::endl;<br>}<br><br>void backcaller(bar&amp; b)<br>{<br>&nbsp;&nbsp;&nbsp; b.BarCallback();<br>&nbsp;&nbsp;&nbsp; b.FooCallback();<br>}<br><br>BOOST_PYTHON_MODULE(busybox)<br>
{<br>&nbsp;&nbsp;&nbsp; class_&lt;foo_wrapper&gt;(&quot;foo&quot;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .def(init&lt;&gt;())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .def(init&lt;int, int&gt;())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .ENABLE_COPY(foo)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .def_readwrite(&quot;x&quot;, &amp;foo::x )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .def_readonly (&quot;y&quot;, &amp;foo::y )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br><br>&nbsp;&nbsp;&nbsp; class_&lt;bar_wrapper, bases&lt;foo&gt; &gt;(&quot;bar&quot;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .def(init&lt;&gt;())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .def(init&lt;int,int,int&gt;())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .ENABLE_COPY(bar)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .def_readwrite(&quot;z&quot;, &amp;bar::z)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br><br>&nbsp;&nbsp;&nbsp; def(&quot;backcaller&quot;, &amp;backcaller);<br>}<br><br>in python:<br>&gt;&gt;&gt; import busybox<br>&gt;&gt;&gt; class myBar(busybox.bar):<br>...&nbsp;&nbsp;&nbsp;&nbsp; def FooCallback(self):<br>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;this is a foo callback&quot;<br>
...&nbsp;&nbsp;&nbsp;&nbsp; def BarCallback(self):<br>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;this is a bar callback&quot;<br>...<br>&gt;&gt;&gt; b = myBar()<br>&gt;&gt;&gt; busybox.backcaller(b)<br>atemptting bar callback<br>this is a bar callback<br>default foo called<br>
&gt;&gt;&gt;<br><br>So the question is: why is the default FooCallback in foo getting called rather then the FooCallback in myBar? <br>What can I do about it?<br><br>