I am surprised that you get the error since the code looks legal. The whole
point of polymorphism is to allow exactly this case - a null method in the
base class that a derived class is then free to overload. It is not just a
null method, it is also default functionality.

Unless I am missing something here, it suggests to me that you have hit a
C++ compiler bug. b.bar(FOO2) should be calling the base class method,
otherwise what's the point of inherited methods. You could try putting a
semi-colon within the curly braces - not necessary but it may help the
compiler to understand just what it has got.

PhilT


-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] Behalf Of Mike Wittman
Sent: 30 March 2007 22:37
To: osg users
Subject: RE: [osg-users] build break...


> >Yes, that would definitely work.  The other alternative which is cleaner
> >is to detect when I'm invoking a virtual method defined in a base class
> >and generate code that casts the object pointer to the base class type
> >before invoking the method.  I've got sufficient type information to do
> >that, it's just a matter of putting in the effort to implement it...
> >
> >-Mike
>
> Speaking strictly as a C++ guy wouldn't what you're proposing be a giant
> no-op?  Isn't the whole point of virtual methods to give you the ability
to
> call derived class methods when using a base class 'this' pointer?  So
> wouldn't casting from a derived type 'this' pointer to a base type 'this'
> pointer and then calling a virtual method be the same as just using the
> derived type?
>
> J.

Yep, it's a no-op from a run-time perspective.  But the problem I'm
trying to solve actually manifests as a compile-time error, since C++
overload resolution does not take inherited virtual methods into
account.  Basically, if you invoke an overloaded virtual method on a
derived type pointer, and that derived type does not override all of the
overloaded instances of that virtual function in the base class, you can
get a compilation error.
Here's a simple example:

 enum T1 { FOO1 };
 enum T2 { FOO2 };

 struct A {
   virtual void bar(T1) { }
   virtual void bar(T2) { }
 };

 struct B : public A {
   virtual void bar(T1) { }
 };

 void error()
 {
   B b;
   b.bar(FOO2);  // gives error since compiler cannot find void bar(T2) in
B.
 }


There are several subclasses in OSG that satisfy this property.  It's
caused a minor headache when generating code to invoke the virtual
functions in those classes.

-Mike
_______________________________________________
osg-users mailing list
[email protected]
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/


_______________________________________________
osg-users mailing list
[email protected]
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/

Reply via email to