[net.lang.c++] `inherited' keyword

sam@think.COM (Sam Kendall) (09/13/86)

I just read a draft of the C+- specification from Apple.  It mentions a
keyword `inherited' as "a proposed addition to C++ that has not yet been
adopted by AT&T," used (in C+-) as follows:

	inherited::virtual_function

This gets you the virtual function belonging to the nearest superclass.
What is not mentioned in the C+- document, and what I would like to
know, is

(1) Does `inherited' work for members other than virtual functions?  It
    certainly should.  If static virtual data items are allowed in C++
    (are they?  I couldn't find anything in the ref man that prohibits
    them) then inherited should work for them, too.

(2) What is the current status of this construct?  Something like it is
    certainly needed to make it easier to do a Smalltalk-like
    send super.

John Rose, a co-worker of mine, came up with a syntax for send super
<same message>.  It is just `continue()' called as a function; used
inside a member function `f', it calls the same thing as
`inherited::f()', and works for non-virtual as well as virtual
functions.

A general point: the `continue' keyword is available and could be used
in place of `inherited'.  It is no less clear than `inherited' --
`inherited' is really the wrong word here, since you use `inherited'
for precisely those things which were NOT inherited.  I suppose
`inherited' is supposed to stand for "would have been inherited".
`continue' can be thought of as meaning "continue up the inheritance
tree".

---
Sam Kendall			sam@Think.COM
Thinking Machines Corp.		ihnp4!think!sam

keith@cecil.UUCP (keith gorlen) (09/13/86)

What is "C+-", and how can I get a copy of the specification?
Thanks!

-- 
---
	Keith Gorlen
	Building 12A, Room 2017
	Computer Systems Laboratory
	Division of Computer Research and Technology
	National Institutes of Health
	Bethesda, MD 20892
	phone:	(301) 496-5363
	uucp:	{decvax!}seismo!elsie!cecil!keith

bs@alice.UucP (Bjarne Stroustrup) (09/15/86)

> From: sam@think.COM (Sam Kendall)
> Newsgroups: net.lang.c++
> Subject: `inherited' keyword
> Organization: Thinking Machines, Cambridge, MA
> 
> I just read a draft of the C+- specification from Apple.  It mentions a
> keyword `inherited' as "a proposed addition to C++ that has not yet been
> adopted by AT&T," used (in C+-) as follows:
> 
> 	inherited::virtual_function
> 
> This gets you the virtual function belonging to the nearest superclass.
> What is not mentioned in the C+- document,

I'd like to comment on this. C+- was intented as an intermediate stage between
C and C++ with special features for accessing the Mac Application Environment.
The intention was to make it into a full C++ as soon as possible. As far as I
know the project was discontinued in favor of a full C++ in/for the MacApp.

I don't like the idea of ``a intermediate stage'' at all. It is an open
invitation to incompatibilities. How recent is that document? If it is less
than two months old I'd like a copy.

However, I will comment on ``inherited'' as if it was a proposal for a new
feature for C++. 

First a C++ example:

	struct base { virtual f() { do_something(); };

	struct derived : base { f() { do_something_else(); base::f(); };

This works.

Using the proposed ``inherited'' that example would look like this:

	struct base { virtual f() { do_something(); };

	struct derived : base { f() { do_something_else(); inherited::f(); };

The difference is that to write the call of base::f() the C++ programmer must
know that ``base'' is a base class of ``derived''. That is not neccesary using
``inherited''. Inherited is ``borrowed'' from Apple's Object Pascal and is their
name for Smalltalk's ``superself''. The argument for ``inherited'' over C++'s
explicit qualification is that
	(1) you need to know less to use it.
	(2) consequently, you cannot make a mistake by
		(a) mentioning the wrong base class, or
		(b) changing base class for ``derived'' without appropriately
		    changing the code to reflect that.

This is all reasonable. The counter arguments are:

	(1) C++ has a facility for acessing members of a base class,
	    and one should not add a new facility to a language simply because
	    it is marginally better in some cases. ``inherited'' adds no new
	    functionallity, only a little convenience (costs: a keyword, and
	    bulk to manuals, tutorials, and compilers).
	(2) I knew about ``superself'' when I designed the C++ explicit
	    qualification notation. The problem with ``superself'' is
		(a) it is a separate mechanism for accessing members of
		    a base class, not a general naming mechanism (as the
		    base::f notation is.
		(b) it does not extend to multiple inheritance (Smalltalk
		    proposals (and implementations?) have introduced the
		    equivallent to C++'s notation to cope. For example:

			struct A { f(); };
			struct B { f(); };
			struct C : A : B { f() { A::f(); B::f(); } };

Consequently, I do not see sufficient reason for adding ``inherited'' to C++
and have no plans of doing so. It may seem callous not to consider the fact
that people at Apple like ``inherited'' and has experience with it sufficient
reason to include it, but such ``kindness'' is the road to a giant language.

> and what I would like to know, is
> 
> (1) Does `inherited' work for members other than virtual functions?  It
>     certainly should.

The C++ notation handles all names properly.

>     If static virtual data items are allowed in C++
>     (are they?  I couldn't find anything in the ref man that prohibits
>    them) then inherited should work for them, too.

There are no virtual data in C++; there does not for the moment appear to be
a sufficient agreement on what ``virtual data'' ought to be to include the
concept.
 
> (2) What is the current status of this construct?  Something like it is
>     certainly needed to make it easier to do a Smalltalk-like
>     send super.

Even given the ``base::f'' notation?

> John Rose, a co-worker of mine, came up with a syntax for send super
> <same message>.  It is just `continue()' called as a function; used
> inside a member function `f', it calls the same thing as
> `inherited::f()', and works for non-virtual as well as virtual
> functions.

Plain ``continue()'' has the problem of only handling call of a base class
function of the same name. The following case is possible in C++ as currently
implemented, but not with ``continue()'':

	struct A { f(); g(); };
	struct B : A { f(); g(); };
	B::f() {
		A::f();	// A's f
		A::g();	// A's g
	}

> A general point: the `continue' keyword is available and could be used
> in place of `inherited'.  It is no less clear than `inherited' --
> `inherited' is really the wrong word here, since you use `inherited'
> for precisely those things which were NOT inherited.  I suppose
> `inherited' is supposed to stand for "would have been inherited".
> `continue' can be thought of as meaning "continue up the inheritance
> tree".

In addition it might be noted that the following works:

	struct A { f(); };
	struct B : A {};
	struct C : B { g() { B::f(); } };

The notation B::f finds A::f since B inherited f from A.