<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Member Function Pointers and Inheritance</title>
		<link>http://www.allegro.cc/forums/view/616520</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 07 Oct 2016 23:58:35 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Howdy.</p><p>I&#39;ve got some code I want to simplify (complicate) by using member function pointers.</p><p>I&#39;ve got a set of flag state setter functions in my WidgetBase base class. Their type is <span class="source-code"><span class="k1">void</span> <span class="k2">(</span>WidgetBase::<span class="k3">*</span>StateSetter<span class="k2">)</span><span class="k2">(</span><span class="k1">bool</span><span class="k2">)</span></span>. My question is this : They are declared as virtual in the WidgetBase base class, and they are overridden in derived classes as necessary. Now suppose I have a derived class that is overloading one of these state setter functions, but needs to call the base class implementation of the function. How do I do that with member function pointers? Is it enough to declare their type as <span class="source-code"><span class="k1">void</span> <span class="k2">(</span>WidgetBase::<span class="k3">*</span>StateSetter<span class="k2">)</span><span class="k2">(</span><span class="k1">bool</span><span class="k2">)</span></span>? Will that call the base class function if I call it on an object of derived type because it is declared to be a member function of class WidgetBase? Or will it call a derived class implementation because it is a virtual function?</p><p>Code example :
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">class</span> WidgetBase <span class="k2">{</span>
   <span class="c">/// ...</span>
   <span class="k1">virtual</span> <span class="k1">void</span> SetEnabledState      <span class="k2">(</span><span class="k1">bool</span> state<span class="k2">)</span><span class="k2">;</span><span class="c">// Sets bg redraw flag</span>
   <span class="k1">virtual</span> <span class="k1">void</span> SetVisibilityState   <span class="k2">(</span><span class="k1">bool</span> state<span class="k2">)</span><span class="k2">;</span><span class="c">// Sets bg redraw flag</span>
   <span class="k1">virtual</span> <span class="k1">void</span> SetHoverState        <span class="k2">(</span><span class="k1">bool</span> state<span class="k2">)</span><span class="k2">;</span><span class="c">// /* Does not set any redraw flag */ - OLD:Sets redraw flag and (false) sets bg redraw flag</span>
   <span class="k1">virtual</span> <span class="k1">void</span> SetFocusState        <span class="k2">(</span><span class="k1">bool</span> state<span class="k2">)</span><span class="k2">;</span><span class="c">// Sets redraw flag and (false) sets bg redraw flag</span>
   <span class="k1">virtual</span> <span class="k1">void</span> SetMoveableState     <span class="k2">(</span><span class="k1">bool</span> state<span class="k2">)</span><span class="k2">;</span><span class="c">// Does not set redraw flag</span>
   <span class="k1">virtual</span> <span class="k1">void</span> SetResizeableState   <span class="k2">(</span><span class="k1">bool</span> state<span class="k2">)</span><span class="k2">;</span><span class="c">// Does not set redraw flag</span>
   <span class="k1">virtual</span> <span class="k1">void</span> SetNeedsRedrawState  <span class="k2">(</span><span class="k1">bool</span> state<span class="k2">)</span><span class="k2">;</span>
   <span class="k1">virtual</span> <span class="k1">void</span> SetNeedsBgRedrawState<span class="k2">(</span><span class="k1">bool</span> state<span class="k2">)</span><span class="k2">;</span><span class="c">// (true) sets redraw flag</span>
   <span class="k1">virtual</span> <span class="k1">void</span> SetAllowCloseState   <span class="k2">(</span><span class="k1">bool</span> state<span class="k2">)</span><span class="k2">;</span><span class="c">// Does not set redraw flag</span>
   <span class="k1">virtual</span> <span class="k1">void</span> SetAllowOverlapState <span class="k2">(</span><span class="k1">bool</span> state<span class="k2">)</span><span class="k2">;</span><span class="c">// Does not set redraw flag</span>
<span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>

And then in the derived class (in this case, a TextDecorator, which inherits publically from Decorator, which inherits publically from WidgetBase) I want to call this member function on three different objects, 1) A BasicButton* (derived from WidgetBase), 2) A Layout* (also derived from WidgetBase) and 3) the Decorator base of a TextDecorator object).</p><p>So I have code like this :
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> TextDecorator::SetFlagState<span class="k2">(</span><span class="k1">bool</span> state , <span class="k1">void</span> <span class="k2">(</span>WidgetBase::<span class="k3">*</span>StateSetter<span class="k2">)</span><span class="k2">(</span><span class="k1">bool</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
   <span class="k1">if</span> <span class="k2">(</span>basic_text_widget<span class="k2">)</span> <span class="k2">{</span>
      <span class="k2">(</span>basic_text_widget.<span class="k3">*</span>StateSetter<span class="k2">)</span><span class="k2">(</span>state<span class="k2">)</span><span class="k2">;</span>
   <span class="k2">}</span>
   <span class="k2">(</span>text_widget_layout-&gt;<span class="k3">*</span>StateSetter<span class="k2">)</span><span class="k2">(</span>state<span class="k2">)</span><span class="k2">;</span>
   <span class="k2">(</span>this-&gt;<span class="k3">*</span>StateSetter<span class="k2">)</span><span class="k2">(</span>state<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

And then in my overloaded TextDecorator state setter functions I want to call it like this :
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> TextDecorator::SetEnabledState<span class="k2">(</span><span class="k1">bool</span> state<span class="k2">)</span> <span class="k2">{</span>
   SetFlagState<span class="k2">(</span>state , WidgetBase::SetEnabledState<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>

<span class="k1">void</span> TextDecorator::SetVisibilityState<span class="k2">(</span><span class="k1">bool</span> state<span class="k2">)</span> <span class="k2">{</span>
   SetFlagState<span class="k2">(</span>state , WidgetBase::SetVisibilityState<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>

<span class="c">/// so on... etc...</span>
</pre></div></div><p>

Will this call the base class state setter or the virtual one? Is this compiler dependent? I am running a little test on some example classes. It seems that virtual inheritance is used and it calls the derived class function instead of the base class one. Is it possible to make it call the base class function instead???</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>
<span class="number">  2</span>
<span class="number">  3</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">  4</span><span class="k1">using</span> std::cout<span class="k2">;</span>
<span class="number">  5</span><span class="k1">using</span> std::endl<span class="k2">;</span>
<span class="number">  6</span><span class="p">#include &lt;cstdlib&gt;</span>
<span class="number">  7</span>
<span class="number">  8</span>
<span class="number">  9</span><span class="k1">class</span> A <span class="k2">{</span>
<span class="number"> 10</span><span class="k1">public</span> <span class="k2">:</span>
<span class="number"> 11</span>   <span class="k1">virtual</span> <span class="k1">void</span> DoThis<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"A::DoThis"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span><span class="k2">}</span>
<span class="number"> 12</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 13</span>
<span class="number"> 14</span><span class="k1">class</span> B <span class="k2">:</span> <span class="k1">public</span> A <span class="k2">{</span>
<span class="number"> 15</span><span class="k1">public</span> <span class="k2">:</span>
<span class="number"> 16</span>   <span class="k1">virtual</span> <span class="k1">void</span> DoThis<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"B::DoThis"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span><span class="k2">}</span>
<span class="number"> 17</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 18</span>
<span class="number"> 19</span><span class="k1">class</span> C <span class="k2">:</span> <span class="k1">public</span> B <span class="k2">{</span>
<span class="number"> 20</span><span class="k1">public</span> <span class="k2">:</span>
<span class="number"> 21</span>   <span class="k1">virtual</span> <span class="k1">void</span> DoThis<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"C::DoThis"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span><span class="k2">}</span>
<span class="number"> 22</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 23</span>
<span class="number"> 24</span><span class="k1">void</span> DoStuff<span class="k2">(</span>A<span class="k3">*</span> a , <span class="k1">void</span> <span class="k2">(</span>A::<span class="k3">*</span>DoStuffFunction<span class="k2">)</span><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 25</span>   <span class="k2">(</span>a-&gt;<span class="k3">*</span>DoStuffFunction<span class="k2">)</span><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>   <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 27</span><span class="k2">}</span>
<span class="number"> 28</span>
<span class="number"> 29</span>
<span class="number"> 30</span>
<span class="number"> 31</span>
<span class="number"> 32</span>
<span class="number"> 33</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc , <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span> argv<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 34</span>   
<span class="number"> 35</span>   A a<span class="k2">;</span>
<span class="number"> 36</span>   B b<span class="k2">;</span>
<span class="number"> 37</span>   C c<span class="k2">;</span>
<span class="number"> 38</span>   
<span class="number"> 39</span>   DoStuff<span class="k2">(</span><span class="k3">&amp;</span>a , <span class="k3">&amp;</span>A::DoThis<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 40</span>   DoStuff<span class="k2">(</span><span class="k3">&amp;</span>b , <span class="k3">&amp;</span>A::DoThis<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>   DoStuff<span class="k2">(</span><span class="k3">&amp;</span>c , <span class="k3">&amp;</span>A::DoThis<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 42</span>   DoStuff<span class="k2">(</span><span class="k1">dynamic_cast</span><span class="k3">&lt;</span>A<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span><span class="k3">&amp;</span>a<span class="k2">)</span> , <span class="k3">&amp;</span>A::DoThis<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 43</span>   DoStuff<span class="k2">(</span><span class="k1">dynamic_cast</span><span class="k3">&lt;</span>A<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span><span class="k3">&amp;</span>b<span class="k2">)</span> , <span class="k3">&amp;</span>A::DoThis<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 44</span>   DoStuff<span class="k2">(</span><span class="k1">dynamic_cast</span><span class="k3">&lt;</span>A<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span><span class="k3">&amp;</span>c<span class="k2">)</span> , <span class="k3">&amp;</span>A::DoThis<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 45</span>   DoStuff<span class="k2">(</span><span class="k1">static_cast</span><span class="k3">&lt;</span>A<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span><span class="k3">&amp;</span>a<span class="k2">)</span> , <span class="k3">&amp;</span>A::DoThis<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 46</span>   DoStuff<span class="k2">(</span><span class="k1">static_cast</span><span class="k3">&lt;</span>A<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span><span class="k3">&amp;</span>b<span class="k2">)</span> , <span class="k3">&amp;</span>A::DoThis<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 47</span>   DoStuff<span class="k2">(</span><span class="k1">static_cast</span><span class="k3">&lt;</span>A<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span><span class="k3">&amp;</span>c<span class="k2">)</span> , <span class="k3">&amp;</span>A::DoThis<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 48</span><span class="c">///   DoStuff(&amp;b , &amp;B::DoThis);/// Error</span>
<span class="number"> 49</span><span class="c">///   DoStuff(&amp;c , &amp;C::DoThis);/// Error</span>
<span class="number"> 50</span>   
<span class="number"> 51</span>   <a href="http://www.delorie.com/djgpp/doc/libc/libc_802.html" target="_blank">system</a><span class="k2">(</span><span class="s">"Pause"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 52</span>   
<span class="number"> 53</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 54</span><span class="k2">}</span>
</div></div><p>

The output from the program is :
</p><pre>
c:\ctwoplus\progcode\test\MemberFunctionPointers&gt;mfp.exe
A::DoThis
B::DoThis
C::DoThis
A::DoThis
B::DoThis
C::DoThis
A::DoThis
B::DoThis
C::DoThis
Press any key to continue . . .
</pre><p>

I&#39;m using this to condense code and reuse it. Unless you have a better option, or you know what I could do instead to produce clean concise code, please keep your suggestions limited to how I can make this work. No macros please.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 07 Oct 2016 02:23:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>As I&#39;ve understood it, it&#39;s not possible, as pointer to member functions will always call the &quot;correct&quot; virtual function. Maybe think of them as pointing to some fixed vtable-index. You could write a non virtual helper or use a lambda with std::function.<br />I wouldn&#39;t use raw pointers to member functions at all, but strongly favor std::function for storage. It has a small overhead though (it uses the heap to store bound data).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Polybios)</author>
		<pubDate>Fri, 07 Oct 2016 03:00:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>There&#39;s no magical cast I can use???</p><p>EDIT <br />I&#39;m feeling a little dense at the moment. Non-virtual helper? What do you mean? An example of a lambda would help too.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 07 Oct 2016 03:01:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Maybe something like that:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>... 
<span class="number">  2</span>
<span class="number">  3</span><span class="k1">void</span> DoStuff<span class="k2">(</span>A<span class="k3">*</span> a , std::function<span class="k3">&lt;</span><span class="k1">void</span><span class="k2">(</span>A<span class="k3">*</span> a<span class="k2">)</span><span class="k3">&gt;</span> <span class="k3">&amp;</span><span class="k3">&amp;</span>do_stuff<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  4</span><span class="c">//   (a-&gt;A::*DoStuffFunction)();</span>
<span class="number">  5</span>   do_stuff<span class="k2">(</span>a<span class="k2">)</span><span class="k2">;</span> 
<span class="number">  6</span>   <span class="k1">return</span><span class="k2">;</span>
<span class="number">  7</span><span class="k2">}</span>
<span class="number">  8</span>
<span class="number">  9</span>
<span class="number"> 10</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc , <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span> argv<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 11</span>   
<span class="number"> 12</span>   A a<span class="k2">;</span>
<span class="number"> 13</span>   B b<span class="k2">;</span>
<span class="number"> 14</span>   C c<span class="k2">;</span>
<span class="number"> 15</span>   
<span class="number"> 16</span>   DoStuff<span class="k2">(</span><span class="k3">&amp;</span>a, <span class="k2">[</span><span class="k2">]</span><span class="k2">(</span>A<span class="k3">*</span>a<span class="k2">)</span><span class="k2">{</span> a-&gt;A::DoThis<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>   DoStuff<span class="k2">(</span><span class="k3">&amp;</span>b, <span class="k2">[</span><span class="k2">]</span><span class="k2">(</span>A<span class="k3">*</span>a<span class="k2">)</span><span class="k2">{</span> a-&gt;A::DoThis<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>   DoStuff<span class="k2">(</span><span class="k3">&amp;</span>c, <span class="k2">[</span><span class="k2">]</span><span class="k2">(</span>A<span class="k3">*</span>a<span class="k2">)</span><span class="k2">{</span> a-&gt;A::DoThis<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span><span class="k2">}</span>
</div></div><p>

Edit: You can save the lambda, of course, and probably shouldn&#39;t move (no &amp;&amp;)... It&#39;s past midnight now here ^^ But you&#39;ll get the idea I guess.<br />I&#39;m not sure whether it&#39;s a good idea to work &quot;against&quot; polymorphism.<br />The lambda is actually a plain old function in this case, as nothing is captured.<br />So you <b>could</b> also pass by plain-old function pointer instead of std::function, as it will decay to a function pointer when you don&#39;t capture anything. Going to bed now.</p><p>Edit2: <br />I&#39;d probably design it differently: Have the flag manipulation going on in the base class exclusively, being non-virtual, then let those functions call virtual methods like &quot;visibilityChanged()&quot; which can be overriden to react to state changes. Not sure whether that is something you want, though. Now definitively going to bed.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Polybios)</author>
		<pubDate>Fri, 07 Oct 2016 03:21:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Typically overridden derived methods don&#39;t implicitly call their base methods. It&#39;s up to you to decide if that&#39;s desirable (sometimes it isn&#39;t). In C++, due to multiple inheritance, you invoke the base by name, IIRC... Should be something like this:</p><div class="source-code snippet"><div class="inner"><pre>this-&gt;BaseClass::method_name<span class="k2">(</span>args<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

As usual, <span class="source-code">this-&gt;</span> will be optional (but I think it&#39;s a feature, not a bug).</p><p>It&#39;s late, but it looks like your use of function pointers here is merely for code reuse (which should be reasonable). You&#39;d want your method to call the base class method (that&#39;s the usual pattern). It shouldn&#39;t be affected...</p><p>If you&#39;re using function pointers for more than that then you might consider C++ features over C features. Function pointers are sort of a C-feature that are just inherited into C++. I don&#39;t imagine that they&#39;re encouraged.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Fri, 07 Oct 2016 11:03:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/616520/1025442#target">bamccaig</a> said:</div><div class="quote"><p>
Typically overridden derived methods don&#39;t implicitly call their base methods. It&#39;s up to you to decide if that&#39;s desirable (sometimes it isn&#39;t). In C++, due to multiple inheritance, you invoke the base by name, IIRC... Should be something like this:
</p><div class="source-code snippet"><div class="inner"><pre>this-&gt;BaseClass::method_name<span class="k2">(</span>args<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div></div><p>
The overridden methods need to call the base class methods because they are the ones that actually set the state. That&#39;s why they&#39;re provided. I was looking for that syntax, but in this case it doesn&#39;t help because I&#39;m calling the function through a pointer. The variable is the member function. I could write out the calls all by hand but then I can&#39;t use a single function call for all the functions that use it. That&#39;s why I was using a member function pointer, because the function to call is what varies.</p><div class="quote_container"><div class="title">bamccaig said:</div><div class="quote"><p>
It&#39;s late, but it looks like your use of function pointers here is merely for code reuse (which should be reasonable). You&#39;d want your method to call the base class method (that&#39;s the usual pattern). It shouldn&#39;t be affected...
</p></div></div><p>
That&#39;s just it, I can&#39;t call the base class through the function pointer because it calls the virtual method.</p><p>I find it hard to believe that C++ would make such a giant oversight as not allowing for a function pointer to point to a certain member function, virtual or not. There must be a way.</p><p>Is there any way to write the following function so that it will compile?
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> TextDecorator::SetFlagState<span class="k2">(</span><span class="k1">bool</span> state , <span class="k1">void</span> <span class="k2">(</span>WidgetBase::<span class="k3">*</span>StateSetter<span class="k2">)</span><span class="k2">(</span><span class="k1">bool</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
   <span class="k1">if</span> <span class="k2">(</span>basic_text_widget<span class="k2">)</span> <span class="k2">{</span>
      <span class="k2">(</span>basic_text_widget-&gt;WidgetBase::<span class="k3">*</span>StateSetter<span class="k2">)</span><span class="k2">(</span>state<span class="k2">)</span><span class="k2">;</span>
   <span class="k2">}</span>
   <span class="k2">(</span>text_widget_layout-&gt;WidgetBase::<span class="k3">*</span>StateSetter<span class="k2">)</span><span class="k2">(</span>state<span class="k2">)</span><span class="k2">;</span>
   <span class="k2">(</span>this-&gt;WidgetDecoratorBase::<span class="k3">*</span>StateSetter<span class="k2">)</span><span class="k2">(</span>state<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
What I need it to do is call the state setter of the basic text widget from it&#39;s base class WidgetBase. Same for the text widget layout. Then for this I need it to call the state setter from the WidgetDecoratorBase class. Is any of this possible with C++?</p><div class="quote_container"><div class="title">PolyBios said:</div><div class="quote"><p>
Edit2:<br />I&#39;d probably design it differently: Have the flag manipulation going on in the base class exclusively, being non-virtual, then let those functions call virtual methods like &quot;visibilityChanged()&quot; which can be overriden to react to state changes. Not sure whether that is something you want, though. Now definitively going to bed. 
</p></div></div><p>
I think this is a possibility. If the function weren&#39;t virtual then it would call the correct version.</p><p>EDIT<br />It turns out this is partly possible. If I cast to a WidgetBase before calling the member function pointer then it will call the base class function. The problem is that this makes a temporary copy of the object, and doesn&#39;t actually affect the object directly any more.
</p><div class="source-code snippet"><div class="inner"><pre>Base b<span class="k2">;</span>
Derived d<span class="k2">;</span>
<span class="k1">void</span> <span class="k2">(</span>Base::<span class="k3">*</span><span class="k2">)</span><span class="k2">(</span><span class="k2">)</span> bfunc <span class="k3">=</span> Base::func<span class="k2">;</span>
d.<span class="k3">*</span>bfunc<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="c">// No good, calls D::func</span>
Base bd<span class="k2">(</span>d<span class="k2">)</span><span class="k2">;</span><span class="c">// Have to make a base class copy</span>
<span class="k2">(</span>bd.<span class="k3">*</span>bfunc<span class="k2">)</span><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="c">// Will call the base class Base::func</span>
<span class="c">// not helpful</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 07 Oct 2016 23:58:35 +0000</pubDate>
	</item>
</rss>
