/*Orion Lawlor's Simple C++ Examples, olawlor@acm.org
Shows the (strange) order in which constructors/destructors
get called.
*/
#include <iostream>
void at(const char *where1,const char *where2=NULL) 
{
	std::cout<<where1;
	if (where2!=NULL) std::cout<<where2;
	std::cout<<std::endl;
}

class foo {
	const char *tag;
public:
	foo(const char *Ntag):tag(Ntag) {at("foo constructor: ",tag);}
	~foo() {at("foo destructor: ",tag);}
};

class parent {
	foo z;
public:
	parent() :z("parent subobject") {at("parent constructor");}
	~parent() {at("parent destructor");}
};
class child:public parent {
	foo f;
	foo b;
public:
	child() :f("  First child subobject"),b("     Second child subobject")
		{at("child constructor");}
	~child() {at("child destructor");}
};

foo g_a("First global");
foo g_b("  Second global");
foo g_c("    Third global");
int main()
{
	foo a("      First local");
	foo b("        Second local");
	foo c("          Third local");
	child d;
	
	return 0;
}
/*<@>
<@> ******** Program output: ********
<@> foo constructor: First global
<@> foo constructor:   Second global
<@> foo constructor:     Third global
<@> foo constructor:       First local
<@> foo constructor:         Second local
<@> foo constructor:           Third local
<@> foo constructor: parent subobject
<@> parent constructor
<@> foo constructor:   First child subobject
<@> foo constructor:      Second child subobject
<@> child constructor
<@> child destructor
<@> foo destructor:      Second child subobject
<@> foo destructor:   First child subobject
<@> parent destructor
<@> foo destructor: parent subobject
<@> foo destructor:           Third local
<@> foo destructor:         Second local
<@> foo destructor:       First local
<@> foo destructor:     Third global
<@> foo destructor:   Second global
<@> foo destructor: First global
<@> */
