Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!watmath!watnot!watrose!gjditchfield
From: gjditchfield@watrose.UUCP
Newsgroups: comp.lang.c++
Subject: virtual functions
Message-ID: <8325@watrose.UUCP>
Date: Thu, 11-Dec-86 22:02:53 EST
Article-I.D.: watrose.8325
Posted: Thu Dec 11 22:02:53 1986
Date-Received: Sun, 14-Dec-86 15:18:52 EST
Distribution: comp
Organization: U of Waterloo, Ontario
Lines: 72

C++ seems to be generating code that cc won't accept. Am I doing something
wrong? 

This code was taken from section 7.2.8 of The Book.
------------
#include 
struct employee {
    employee*	next;
    char*	name;
    short	department;
    virtual void print();
    };
void employee::print()
{   cout << name << "\t" << department << "\n";
    }
struct manager:employee {
    employee*	group;
    short	level;
    void	print();
    };
void manager::print()
{   employee::print();
    cout << "\tlevel" << level << "\n";
    }
void f(employee* ll)
{   for (; ll; ll=ll->next)
	ll->print();
    }
main()
{   employee e;
    e.name = "j.brown";
    e.department = 1234;
    manager m;
    m.name = "j.smith";
    m.level = 2;
    m.next = &e;
    f(&m);
    }
----------------
When I run it through C++, I get these error messages from cc:
"virt.cc", line 22: illegal function
"virt.cc", line 22: illegal function
where line 22 is "ll->print()" in function f. (The local support people
have set things up so that C++ files must have names ending in .cc.)

C++'s output, slightly prettified, looks like this:
----------------
#line 1 "virt.cc"

/* <> */
//  ...

#line 20 "virt.cc"
int f (_auto_ll )struct employee *_auto_ll ;
{ 
	for(;_auto_ll ;_auto_ll = _auto_ll -> _employee_next )
#line 22 "virt.cc"
		(*(((int (*)())(*_auto_ll -> _employee__vptr ))))
		(*(((int (*)())(*_auto_ll -> _employee__vptr ))))( _auto_ll) ;
};
---------------
(I have broken the output for line 22 in two, for clarity.) The expression
referring to _employee__vptr seems to be meant to retrieve a pointer to the
appropriate print() routine, but I don't see why the expression should be
generated twice!

I would be delighted to find out that this is all my fault. Comments?
-- 
-------------------------------------------------------------------------------
Glen Ditchfield                      {watmath,utzoo,ihnp4}!watrose!gjditchfield
Dept of Computer Science, U of Waterloo         (519) 885-1211 x6658
Waterloo, Ontario, Canada
"Flame not, lest thou be singed" - Mr. Protocol