salzman@randvax.UUCP (Isaac Salzman) (10/03/89)
i've made one minor change in class.h: C++ destructors must be declared virtual in order to have compatible behaviour with THINK C objects and their use of the Destroy() method in class.h. included are context diffs to class.h and the README file. for those who requested a binhex/stuffit copy -- i've sent one off to info-mac. i originally posted in shar format since i assume most people reading Usenet are on a UNIX system and, that anyone interested in this stuff would probably be doing C++ on a UNIX system (though you could be on a PC -- but WHY??!! :-) -Isaac (salzman@rand.org) ------------------------------------------------------------------------ *** README.orig Tue Oct 3 01:28:44 1989 --- README Tue Oct 3 01:28:47 1989 *************** *** 7,18 **** as desired so long as this copyright notice remains in tact. ! $Header: /tmp_mnt/amnt/lh/salzman/src/class/RCS/README,v 1.1 89/09/17 15:01:41 salzman Exp $ $Log: README,v $ Revision 1.1 89/09/17 15:01:41 salzman Initial revision ! */ The contents of this archive are as follows: --- 7,21 ---- as desired so long as this copyright notice remains in tact. ! $Header: /tmp_mnt/amnt/lh/salzman/src/class/RCS/README,v 1.2 89/10/03 00:32:58 salzman Exp Locker: salzman $ $Log: README,v $ + Revision 1.2 89/10/03 00:32:58 salzman + added note about virtual destructors + Revision 1.1 89/09/17 15:01:41 salzman Initial revision ! */ The contents of this archive are as follows: *************** *** 311,317 **** #define DestroyObject(Object) { Object->Destroy();delete(Object); } #define DESTROY_SUPER inherited::Destroy() ! C++: #define DECL_DEST(Class) ~Class #define DEF_DEST(Class) Class::~Class #define DestroyObject(Object) delete Object #define DESTROY_SUPER --- 314,320 ---- #define DestroyObject(Object) { Object->Destroy();delete(Object); } #define DESTROY_SUPER inherited::Destroy() ! C++: #define DECL_DEST(Class) virtual ~Class #define DEF_DEST(Class) Class::~Class #define DestroyObject(Object) delete Object #define DESTROY_SUPER *************** *** 346,356 **** I chose to stick with this convention. If you want to append the class name in TCO, no problem: just use Destroy##Class, but then you'd have to pass the class name as an argument as well.... ! ! C++ automatically calls destructors up the inheritance hierarchy, ! TCO doesn't (it's just another method in TCO), therefore you need ! to use DESTROY_SUPER in TCO -- which just calls the super classes ! Destroy() method, and does nothing in C++. ------------------------------------------------------------------------ --- 349,374 ---- I chose to stick with this convention. If you want to append the class name in TCO, no problem: just use Destroy##Class, but then you'd have to pass the class name as an argument as well.... ! ! ! C++ automatically calls virtual destructors up the inheritance ! hierarchy. TCO doesn't (it's just another method in TCO), ! therefore you need to use DESTROY_SUPER in TCO -- which just ! calls the super classes Destroy() method, and does nothing in C++. ! ! NOTE: destructors MUST be declared virtual in C++ in order for ! them to have compatible behaviour with TCO. There are some ! obscure instances where complete compatability is impossible. ! If you call a virtual destructor for a derived class, it will ! work its way up the hierarchy calling destructors for each ! base class. As it leaves a destructor, the object does not belong ! to that class anymore. It changes its identity along the way. The ! result is that if you're calling virtual methods in your destructors, ! you will not get the expected results. Since, in TCO, the Destroy ! method is like any other method, it does not have this odd side ! effect. It turns out that Cfront 1.2 is broken in this respect ! whereas GNU C++ does the right thing (I found this out while ! reporting what I thought may have been a bug in g++). ------------------------------------------------------------------------ *** class.h.orig Tue Oct 3 01:27:56 1989 --- class.h Tue Oct 3 00:34:21 1989 *************** *** 12,20 **** /* *------------------------------------------------------------------ ! * $Header: /tmp_mnt/amnt/lh/salzman/src/class/RCS/class.h,v 1.1 89/09/17 15:01:38 salzman Exp $ *------------------------------------------------------------------ * $Log: class.h,v $ * Revision 1.1 89/09/17 15:01:38 salzman * Initial revision * --- 12,24 ---- /* *------------------------------------------------------------------ ! * $Header: /tmp_mnt/amnt/lh/salzman/src/class/RCS/class.h,v 1.2 89/10/03 00:33:15 salzman Exp Locker: salzman $ *------------------------------------------------------------------ * $Log: class.h,v $ + * Revision 1.2 89/10/03 00:33:15 salzman + * all C++ destructors are virtual for compatability with TCO + * (see README) + * * Revision 1.1 89/09/17 15:01:38 salzman * Initial revision * *************** *** 74,80 **** # define RETURN_THIS /* things needed for destroying objects */ ! # define DECL_DEST(Class) ~Class # define DEF_DEST(Class) Class::~Class # define DestroyObject(Object) delete Object # define DESTROY_SUPER --- 78,84 ---- # define RETURN_THIS /* things needed for destroying objects */ ! # define DECL_DEST(Class) virtual ~Class # define DEF_DEST(Class) Class::~Class # define DestroyObject(Object) delete Object # define DESTROY_SUPER