From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: fac41,b87849933931bc93 X-Google-Attributes: gidfac41,public X-Google-Thread: 109fba,b87849933931bc93 X-Google-Attributes: gid109fba,public X-Google-Thread: 103376,b87849933931bc93 X-Google-Attributes: gid103376,public X-Google-Thread: 1108a1,b87849933931bc93 X-Google-Attributes: gid1108a1,public X-Google-Thread: f43e6,b87849933931bc93 X-Google-Attributes: gidf43e6,public X-Google-Thread: 114809,b87849933931bc93 X-Google-Attributes: gid114809,public From: pcg@aber.ac.uk (Piercarlo Grandi) Subject: Re: What is wrong with OO ? Date: 1997/02/15 Message-ID: #1/1 X-Deja-AN: 219069728 Sender: pcg@cassin.dcs.aber.ac.uk X-Disclaimer: Warning - Sender not verified References: Organization: Prifysgol Cymru, Aberystwyth Newsgroups: comp.lang.c++,comp.lang.smalltalk,comp.lang.eiffel,comp.lang.ada,comp.object,comp.software-eng Date: 1997-02-15T00:00:00+00:00 List-Id: >>> "cjolley" == Charles A Jolley writes: >> Well, who am I to judge.. but in my view C++ is basically C with the >> capability to add functions to structs. Before I tried C++, I would >> bundle pointers to functions in my C-structs to fake some kind of >> OO-like bundling of similar functions ;) C++ take this a major >> step further by actually bundling data and functions together >> in a struct. But that is what classes are in C++: just enhanced >> structs! cjolley> C++ actually does not bundle code with the structs. If a member cjolley> function is not virtual, the compiler will just binds a cjolley> obj.foo() reference to its obj::foo() counterpart. On the cjolley> other hand, if a member function is virtual, then function cjolley> pointers, like you mentioned above, are used. Anyway, just a cjolley> minor detail; they're still just glorified structs. ;) But this is an implementation detail, and even in the implementation vtables of function pointers are not part of any instance of any 'struct'. In ``C++'' in no way data and functions are bundled together; the only bundling is of function declarations/definitions with data declarations/definitions. There is an immense amount of difference between: struct complex { float re,im; struct complex (*add)(struct complex,struct complex); .... }; struct complex c = { .... }; c = (*c.add)(c,c); which is reminiscent of prototype systems and: class complex { float re,im; public: complex add(complex); .... }; complex complex::add(complex b) { ... }; complex c(....); c = c.add(c); which isn't. The difference is that in ``C++'' a 'class'/'struct' definition also doubles up as a module, which contains the definition of a single 'struct' and of a bunch of related functions. In fact a ``C++'' 'class' can be used as a mere module if it does not contains any data member definitions. The above ``C++'' example should really be read as: class complex { struct complex { float re,im; }; public: complex add(complex,complex); .... }; complex::complex complex::add(complex::complex a,b) { ... }; complex::complex c(....); c = complex::add(c,c); If ``C++'' were based on the latter syntax scheme, admittedly more verbose, fewer people would get the wrong impression that there is anything magic/special about the affix syntax and the other syntactic shortcuts. Too bad. Naturally the same observation applies to the other languages with similar syntax, like ``Smalltalk'' and ``Eiffel''; in all of these the affix syntax and the syntactic conflation of the type definition with that of the module can result in confusion, which is made worse in the case of ``Smalltalk'' by the use of actor-like terms... In Ada 95 the more verbose but clearer syntax is required, but then the compiler is not requried to support or enforce the OO paradigm, and allows more than one type definition in a module regardless (also in ``C++'', but only if one uses the more verbose syntax).