octave-maintainers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: c++ question


From: Jaroslav Hajek
Subject: Re: c++ question
Date: Mon, 12 Oct 2009 08:37:59 +0200

On Sun, Oct 11, 2009 at 10:55 PM, Shai Ayal <address@hidden> wrote:
> Hi all,
>
> This is a question I came across while trying to work on opengl
> backend. At first I thought it was too trivial to ask on the list, so
> I asked Michael privately, but since he agrees that it is strange, I
> gained some self confidence and so I'm asking on the list :)
> I am using gcc version 4.3.4 (Debian 4.3.4-5).
>
> Any help would be apriciated. The definitions of the opengl_renderer
> class are in src/gl-render.h
>
> Shai
>
> On Sat, Oct 10, 2009 at 8:55 PM, Shai Ayal <address@hidden> wrote:
>> On Sat, Oct 10, 2009 at 10:35 AM, Shai Ayal <address@hidden> wrote:
>>> Hi Michael,
>>>
>>> I'm trying to implement the gl2ps code in the gl-renderer, and I've
>>> come across a c++ problem:
>>> As a first step I tried to defined a subclass of opengl_render which
>>> should override the draw method for a handle. In the new method gl2ps
>>> will be initialized. This is the definition:
>>> #include "gl-render.h"
>>>
>>> class
>>> OCTINTERP_API
>>> glps_renderer : public opengl_renderer
>>> {
>>>  public:
>>>  glps_renderer (const std::string& _filename)
>>>    : opengl_renderer () , filename (_filename) { }
>>>
>>>  ~glps_renderer (void) { }
>>>
>>>  void draw (const graphics_object& go);
>>>
>>>  private:
>>>  std::string filename;
>>>
>>> };
>>>
>>> However, when I try to use this in the code:
>>>
>>>        glps_renderer gl2ps (print_filename);
>>>        gl2ps.draw (gh_manager::lookup (number));
>>>
>>> The compiler complains that there is no matching function for call to
>>> ‘glps_renderer::draw(graphics_handle).
>>>
>>> I thought it would automatically use the base class
>>> opengl_render::draw(graphics_handle) which would then call
>>> glps_renderer::draw (const graphics_object& go);
>>>
>> OK, I think I figured it out :
>> opengl_renderer *rend = new glps_renderer (print_filename);
>> rend->draw (gh_manager::lookup (number));
>>
>> so it appears the compiler is able to do run time dynamic functions,
>> but not compile time. Strange.
>>

No, it would work the same if the methods were non-virtual, it plays
no role. What you see is a bit unknown C++ feature called "name
hiding". In short, methods from base class are not automatically
imported into the subclass namespace if there's an overloaded version
declared in the subclass. (Trust me, there are good reasons for this).

You can either import it explicitly:

class
OCTINTERP_API
glps_renderer : public opengl_renderer
{
 public:
   using opengl_renderer::draw;
 glps_renderer (const std::string& _filename)
   : opengl_renderer () , filename (_filename) { }

 ~glps_renderer (void) { }

 void draw (const graphics_object& go);

 private:
 std::string filename;

};

to the public section of gpls_renderer,

or make the call like this:

  glps_renderer gl2ps (print_filename);
  gl2ps.opengl_renderer::draw (gh_manager::lookup (number));


>> Now for the next problem:
>> the opengl_renderer::draw function is actually a dispatcher based upon
>> the object type. The way I implemented the gl2ps renderer, I override
>> the draw method, do the gl2ps initializations and then call
>> opengl_renderer::draw.
>> The problem is I would like to override some specific draw function
>> (e.g.  virtual void draw (const text::properties& props);), but
>> instead of the glps_renderer version being called, the base
>> opengl_renderer version is called. So when calling with a text object
>> the sequence is:
>>
>> opengl_renderer::draw (const graphics_handle& h)
>> glps_renderer::draw (const graphics_object& go);
>> opengl_renderer::draw (const graphics_object& go);
>> opengl_renderer::draw (const text::properties& props)
>>
>> although there is a glps_renderer::draw (const text::properties& props)
>>
>> Any thoughts?
>

Please post your code, or a (not working) changeset. I'd like to help,
but I need more info.

regards

-- 
RNDr. Jaroslav Hajek
computing expert & GNU Octave developer
Aeronautical Research and Test Institute (VZLU)
Prague, Czech Republic
url: www.highegg.matfyz.cz



reply via email to

[Prev in Thread] Current Thread [Next in Thread]