c++ - Accessing sub class's member functions through base class pointer -


i trying write class uses dom write list of registrations file xml. list of registrations contains 3 types of registration registration standard base registration class guestregistration , studentregistration both derive registration.

the guestregistration class has unique member category , student registration has unique member qualification.

when iterate on list of registration pointers have access base class registration's member functions. there way can access subclasses' data members use getter functions getcategory , getqualification? i've tried creating guestregistration , studentregistration pointer whenever class name matches either of two, pointer conversion error.

void registrationlistwriter::write(registrationlist r) {     qlist<registration*> reglist = r.getregistrationlist();      (int = 0; < reglist.size(); ++i) {         qstring cn = reglist.at(i)->metaobject()->classname();         person tempperson = reglist.at(i)->getattendee();          appendregistrationandtype(cn);         appendattendee(tempperson);         //this issue starts         if (cn == "guestregistration") {             guestregistration guestreg = reglist.at(i);             appendattendeecatagory(guestreg.getcatagory());         }          if (cn == "studentregistration") {             studentregistration* stureg = reglist.at(i);             appendattendeequalification(stureg->getqualification());         }          appendbookingdate(reglist.at(i)->getbookingdate().tostring());         appendregistrationfee(reglist.at(i)->calculatefee());      } } 

you can use dynamic_cast check specific sub-classes:

void registrationlistwriter::write(registrationlist r) {     qlist<registration*> reglist = r.getregistrationlist();      (int = 0; < reglist.size(); ++i) {         registration *reg = reglist.at(i);          appendregistrationandtype(reg->metaobject()->classname());         appendattendee(reg->getattendee());          if (guestregistration *guestreg = dynamic_cast<guestregistration*>(reg)) {             appendattendeecatagory(guestreg->getcatagory());         }         else         if (studentregistration* stureg = dynamic_cast<studentregistration*>(reg)) {             appendattendeequalification(stureg->getqualification());         }         // , on ...          appendbookingdate(reg->getbookingdate().tostring());         appendregistrationfee(reg->calculatefee());         } } 

however, suggest implementing virtual method in registration class sub-classes can override register additional items needed, eg:

class registration {     ...     virtual void appendextraattendees(registrationlistwriter *writer){}     ... }; 

class guestregistration : public registration {     ...     virtual void appendextraattendees(registrationlistwriter *writer);     ... };  void guestregistration::appendextraattendees(registrationlistwriter *writer){     writer->appendattendeecatagory(getcatagory()); } 

class studentregistration : public registration {     ...     virtual void appendextraattendees(registrationlistwriter *writer);     ... };  void studentregistration::appendextraattendees(registrationlistwriter *writer){     writer->appendattendeequalification(getqualification()); } 

void registrationlistwriter::write(registrationlist r) {     qlist<registration*> reglist = r.getregistrationlist();      (int = 0; < reglist.size(); ++i) {         registration *reg = reglist.at(i);          appendregistrationandtype(reg->metaobject()->classname());         appendattendee(reg->getattendee());          reg->appendextraattendees(this);          appendbookingdate(reg->getbookingdate().tostring());         appendregistrationfee(reg->calculatefee());         } } 

alternatively:

class registration {     ...     virtual void appendattendees(registrationlistwriter *writer);     ... };  void registration::appendattendees(registrationlistwriter *writer){     writer->appendattendee(getattendee()); } 

class guestregistration : public registration {     ...     virtual void appendattendees(registrationlistwriter *writer);     ... };  void guestregistration::appendattendees(registrationlistwriter *writer){     registration::appendattendees(writer);     writer->appendattendeecatagory(getcatagory()); } 

class studentregistration : public registration {     ...     virtual void appendattendees(registrationlistwriter *writer);     ... };  void studentregistration::appendattendees(registrationlistwriter *writer){     registration::appendattendees(writer);     writer->appendattendeequalification(getqualification()); } 

void registrationlistwriter::write(registrationlist r) {     qlist<registration*> reglist = r.getregistrationlist();      (int = 0; < reglist.size(); ++i) {         registration *reg = reglist.at(i);          appendregistrationandtype(reg->metaobject()->classname());          reg->appendattendees(this);          appendbookingdate(reg->getbookingdate().tostring());         appendregistrationfee(reg->calculatefee());         } } 

Comments