//bynameorpointer.cpp //observe what happens when we access //base class member functions and //derived class member functions //from // an object name // a pointer to the base class // a pointer to the derived class #include //cout, endl using namespace std; #include "dog.h" #include "mammal.h" //#define BYNAMEORPOINTER_CPP #ifdef BYNAMEORPOINTER_CPP int main() { { //an object of the base class cout << "AN OBJECT OF THE BASE CLASS CAN \n" << "ONLY USE BASE CLASS MEMBER FUNCTIONS." << endl; Mammal m; m.Speak(); m.Sleep(); m.Identify(); //m.WagTail(); } { //an object of the derived class cout << "\n\nAN OBJECT OF THE DERIVED CLASS\n" << "CAN USE BASE CLASS AND DERIVED CLASS\n" << "MEMBER FUNCTIONS." << endl; Dog d; d.Speak(); d.Sleep(); d.Identify(); d.WagTail(); } { //pointer to base class cout << "\n\nA POINTER TO THE BASE CLASS\n" << "THAT POINTS TO AN OBJECT OF " << "THE BASE CLASS\n" << "CAN USE BASE CLASS MEMBER " << "FUNCTIONS ONLY." << endl; Mammal* pM=new Mammal; pM->Speak(); pM->Sleep(); pM->Identify(); //pM->WagTail(); delete pM; } { //pointer to the derived class cout << "\n\nA POINTER TO THE DERIVED CLASS\n" << "THAT POINTS TO AN OBJECT OF THE " << "DERIVED CLASS\n" << "CAN USE BASE CLASS AND DERIVED\n" << "CLASS MEMBER FUNCTIONS." << endl; Dog* pD=new Dog; pD->Speak(); pD->Sleep(); pD->Identify(); pD->WagTail(); delete pD; } { //pointer to the base class, // pointing to object of derived class cout << "\n\nA POINTER TO THE BASE CLASS\n" << "THAT POINTS TO AN OBJECT OF THE " << "DERIVED CLASS\n" << "CAN USE MEMBER FUNCTIONS DEFINED " << "IN THE BASE CLASS. \n**BUT** IT " << "WILL USE THE VERSION DEFINED IN \nTHE " << "BASE CLASS FOR NON-VIRTUAL FUNCTIONS\n" << "AND THE VERSION DEFINED IN THE " << "DERIVED CLASS\nFOR VIRTUAL FUNCTIONS" << ", IF ONE EXISTS." << endl; Mammal * pM=new Dog; pM->Speak(); pM->Sleep(); pM->Identify(); //pM->WagTail(); delete pM; } return 0; } #endif