initializing mutable class attributes

Dan Perl dperl at rogers.com
Thu Sep 2 17:05:28 CEST 2004


"Alex Martelli" <aleaxit at yahoo.com> wrote in message
news:1gjg9tm.14a3nqg36zs8fN%aleaxit at yahoo.com...
     ........
> Incidentally, FAR from your assertion that, in C++, "subclasses don't
> need to know anything about how the superclass is implemented", reality
> is just the other way 'round.  Subclasses have to be _intimately
> familiar_ with key aspects of superclasses' implementation -- not just
> the interface (which fully includes the "little detail" of whether a
> class has a default ctor or not!!!), but specifically _implementation_
> issues, such as what private member names the superclass uses for its
> own implementation purposes.  That's because C++ fatally tries to
> support encapsulation via _accessibility_, NOT through _visibility_.  If
> the subclass unwittingly tries using a member name which the superclass
> is already using privately, it just won't compile; if the superclass
> adds any private names to its implementation from one release to
> another, it will "break all user code" which quite correctly tried to
> use that name (and previously managed w/o problems!) for one of its
> members -- as you say.

No, Alex.  Data members in a C++ subclass cannot conflict with data members
in its superclass, public, protected, or private.  They are resolved by
their namespaces.  See an example:
    #include <iostream>

    class Class1 {
    public:
        void setM1(int arg) {m1=arg;}
        void getM1( ) {std::cout << "c1m1: " << m1 << std::endl;}
    private:
        int m1;
    };
    class Class2 : public Class1 {
    public:
        void setM1(int c1m1, int c2m1) {Class1::setM1(c1m1);    m1=c2m1;}
        void getM1( ) {Class1::getM1( );      std::cout << "c2m1: " << m1 <<
std::endl;}
    private:
        int m1;
    };
    int main(int argc, char **argv)
        {
        Class2 c2 = Class2( );
        c2.setM1(1, 9);
        c2.getM1( );
        }

> Here it is -- now feel free to damage yourself at will with your
> conviction that this (calling superclass ctors) "IS a case" where
> implicit is better.  I decided I can reuse this as a Cookbook recipe,
> after all!-)

I'll look at the metaclass example later.  Thanks.

Dan





More information about the Python-list mailing list