amehta@ptolemy1.rdrc.rpi.edu (09/12/90)
Hi,
Sorry if this has been asked before!
I have a base class, say BASE, and several derived classes.
Can the base class know which derived class is being created
at the time of construction? I want to avoid passing parameters
if possible.
I tried a virtual identity method, but the method becomes valid
only AFTER construction. Consider:
/*---------------------------------------------------------*/
#include <stdio.h>
class BASE { public:
BASE () { printf ("Cons: BASE\n"); identify(); }
virtual void identify () { printf ("Ident: I am a BASE\n"); }
};
class DER1 : public BASE { public:
DER1 () { printf ("Cons: DER1\n"); identify(); }
virtual void identify () { printf ("Ident: I am a DER1\n"); }
};
class DER2 : public DER1 { public:
DER2 () { printf ("Cons: DER2\n"); identify(); }
virtual void identify () { printf ("Ident: I am a DER2\n"); }
};
main() {
printf ("Starting\n");
DER2 d;
d.identify();
printf ("Done\n");
}
/*-------- This program produces as output: -------*/
Starting
Cons: BASE
Ident: I am a BASE
Cons: DER1
Ident: I am a DER1
Cons: DER2
Ident: I am a DER2
Ident: I am a DER2
Done
/*-------------------------------------------------*/
Any help would be much appreciated!
Thanks
Alokbrucec@phoebus.phoebus.labs.tek.com (Bruce Cohen;;50-662;LP=A;) (09/13/90)
In article <H1B%`K#@rpi.edu> amehta@ptolemy1.rdrc.rpi.edu writes: > > I have a base class, say BASE, and several derived classes. > Can the base class know which derived class is being created > at the time of construction? I want to avoid passing parameters > if possible. > Why? You can have the parameters passed automatically by the derived class' constructor, so the main program doesn't need to get involved. > I tried a virtual identity method, but the method becomes valid > only AFTER construction. Consider: > Yep, you can't do that because any virtual function call in a constructor is automatically converted to a call to the function in the constructor's class. This prevents accidentally calling the virtual of a class before the class' constructor has been run, i.e. before a valid object exists. Here's a way to do it with parameter passing and a data member in class BASE: #include <stdio.h> class BASE { public: BASE (const char* ident = "BASE") { printf ("Cons: BASE\n"); identity = ident; identify(); } void identify () { printf ("Ident: I am a %s\n", identity); } protected: const char* identity; }; class DER1 : public BASE { public: DER1 (const char* ident = "DER1") : BASE(ident) { printf ("Cons: DER1\n"); identity = ident; identify(); } }; class DER2 : public DER1 { public: DER2 (const char* ident = "DER2") : DER1 (ident) { printf ("Cons: DER2\n"); identity = ident; identify(); } }; main() { printf ("Starting\n"); DER2 d; d.identify(); printf ("Done\n"); } /*-------- This program produces as output: ------- Starting Cons: BASE Ident: I am a DER2 Cons: DER1 Ident: I am a DER2 Cons: DER2 Ident: I am a DER2 Ident: I am a DER2 Done -- --------------------------------------------------------------------------- NOTE: USE THIS ADDRESS TO REPLY, REPLY-TO IN HEADER MAY BE BROKEN! Bruce Cohen, Computer Research Lab email: brucec@tekcrl.labs.tek.com Tektronix Laboratories, Tektronix, Inc. phone: (503)627-5241 M/S 50-662, P.O. Box 500, Beaverton, OR 97077