Thread overview
virtual data?
Aug 22, 2001
Russ Lewis
Aug 23, 2001
D Man
Aug 23, 2001
Russ Lewis
August 22, 2001
I've often wanted to do things like this:

class Foo {...};
class Foo2 : public Foo {...};
class Bar
{
protected:
  virtual Foo foo;
};
class Bar2 : public Bar
{
protected:
   Foo2 foo;
};



The idea here is that the Bar class uses the Foo class as part of its implementation.  The Bar2 class uses a more advanced version of Bar (that is, a child of Bar) to implement some more advanced functionality.  I want the Foo2 object to *replace* the Foo object so that all code written in Bar that access the Foo object will now make the same calls on the Foo2 object.  (I can give more detailed sample code if somebody is interested how this comes into play.)

This didn't work in C++ because the vtable was constructed iteratively; the most base-level object would first construct its vtable and all of its data, and you would work up from there, modifying the vtable as each successive child is constructed.  Since D constructs the entire vtable before any constructors are called, it would be possible for the vtable to include pointers to virtual data members.  It should work as long as the new class (overriding the old one) is a public child of the base class.

August 23, 2001
I wanted to do the same with enumerations.  I made a post a while back with the info, but basically you could extend or override the set of values in an enumerated set.

It "may" be nice to do that with data, but i would like to see a few real-world examples of this functionality.

Cool idea, nonetheless.

"Russ Lewis" <russ@deming-os.org> wrote in message news:3B8413AE.91A954AF@deming-os.org...
> I've often wanted to do things like this:
>
> class Foo {...};
> class Foo2 : public Foo {...};
> class Bar
> {
> protected:
>   virtual Foo foo;
> };
> class Bar2 : public Bar
> {
> protected:
>    Foo2 foo;
> };
>
>
>
> The idea here is that the Bar class uses the Foo class as part of its implementation.  The Bar2 class uses a more advanced version of Bar (that is, a child of Bar) to implement some more advanced functionality.  I want the Foo2 object to *replace* the Foo object so that all code written in Bar that access the Foo object will now make the same calls on the Foo2 object.  (I can give more detailed sample code if somebody is interested how this comes into play.)
>
> This didn't work in C++ because the vtable was constructed iteratively; the most base-level object would first construct its vtable and all of its data, and you would work up from there, modifying the vtable as each successive child is constructed.  Since D constructs the entire vtable before any constructors are called, it would be possible for the vtable to include pointers to virtual data members.  It should work as long as the new class (overriding the old one) is a public child of the base class.
>


August 23, 2001
D Man wrote:

> I wanted to do the same with enumerations.  I made a post a while back with the info, but basically you could extend or override the set of values in an enumerated set.
>
> It "may" be nice to do that with data, but i would like to see a few real-world examples of this functionality.

I'm trying to think of a good example without exposing internal code. :(  I have a *great* example of why this is useful (that I developed as a senior project for school), but my company has not yet said that I can GPL it - until then it's company property.

I'll keep thinking to see if I can find a good example w/o exposing too much. :(