280 likes | 531 Views
C++ for the MFE class at UC Berkeley Session #2. Yuli Kaplunovsky MFE, MBA, MS-Tax, CFA yuli@FinancialSimulations.com (408) 884 5965. Inheritance: d erive one class from another. class Mammal { public: Mammal(); ~Mammal(); int GetAge(); void SetAge(int);
E N D
C++ for the MFE class at UC BerkeleySession #2 Yuli Kaplunovsky MFE, MBA, MS-Tax, CFA yuli@FinancialSimulations.com (408) 884 5965
Inheritance: derive one class from another class Mammal { public: Mammal(); ~Mammal(); int GetAge(); void SetAge(int); int GetWeight(); void SetWeight(); void Speak(); void Sleep(); protected: int itsAge; int itsWeight; }; enum BREED { SHETLAND, DOBERMAN, LAB }; class Dog : public Mammal { public: Dog(); ~Dog(); BREED GetBreed() const; void SetBreed(BREED); protected: BREED itsBreed; }; void main() { Dog fido; fido.SetAge(3); fido.SetBreed( SHETLAND ); cout << "Fido is " << fido.GetAge() << " years old\n"; }
Inheritance: Overriding Functions class Mammal { public: // constructors Mammal() { cout << "Mammal constructor...\n"; } ~Mammal() { cout << "Mammal destructor...\n"; } void Speak() { cout << "Mammal sound!\n"; } void Sleep() { cout << "shhh. I'm sleeping.\n"; } protected: int itsAge; int itsWeight; }; int main() { Mammal bigAnimal; Dog fido; bigAnimal.Sleep(); bigAnimal.Speak(); fido.Sleep(); fido.Speak(); return 0; } Mammal constructor... Mammal constructor... Dog constructor... Shh. I’m sleeping. Mammal sound! Shh. I’m sleeping. Woof! Dog destructor... Mammal destructor... Mammal destructor... class Dog : public Mammal { public: Dog() { cout << "Dog constructor...\n"; } ~Dog() { cout << "Dog destructor...\n"; } void WagTail() { cout << "Tail wagging...\n"; } void BegForFood() { cout << "Begging for food...\n"; } void Speak() { cout << "Woof!\n"; } private: BREED itsBreed; };
Pointer to a class void main() { Dog *pFido = new Dog; pFido->SetAge( 4 ); PrintDogsAge( pFido ); Dog *pMyDog; pMyDog = pFido; PrintDogsAge( pMyDog ); Dog Barky; Barky.SetAge(3); pMyDog = &Barky; int I = pMyDog->GetAge(); pMyDog = pFido; I = pMyDog->GetAge(); int J = pFido->GetAge(); int K = Barky.GetAge(); } void PrintDogsAge( Dog * P ) { printf("The age of the ” “Dog is: %d \n", P->GetAge(); } Exercise: Write the output of this program
Virtual class Mammal { public: Mammal():itsAge(1) { cout << "Mammal constructor...\n"; } ~Mammal() { cout << "Mammal destructor...\n"; } void Move() { cout << "Mammal move one step\n"; } virtual void Speak() { cout << "Mammal speak!\n"; } protected: int itsAge; }; int main() { Mammal *pDog = new Dog; pDog->Move(); pDog->Speak(); } Mammal constructor... Dog Constructor... Mammal move one step Woof! class Dog : public Mammal { public: Dog() { cout << "Dog Constructor...\n"; } ~Dog() { cout << "Dog destructor...\n"; } void WagTail() { cout << "Wagging Tail...\n"; } void Speak() { cout << "Woof!\n"; } void Move() { cout << "Dog moves 5 steps...\n"; } }; Dog Fido; Fido.Move(); Fido.Speak(); Mammal constructor... Dog Constructor... Dog moves 5 steps Woof! Dog destructor Mammal destructor
Virtual – Why do we need it? For example, you could create many different types of windows, including dialog boxes, scrollable windows, and list boxes, and give them each a virtual draw() method. By creating a pointer to a window and assigning dialog boxes and other derived types to that pointer, you can call draw() without regard to the actual run-time type of the object pointed to. The correct draw() function will be called. Exercise: Write example of three classes: base class (CWindow), and two derivative classes (CListBox and CDialogBox) which implement the function draw differently. And a function that receives a pointer of the type CWindow, and calls the draw function.
Static variables class Cat { public: Cat(int age):itsAge(age) { HowManyCats++; } virtual ~Cat() { HowManyCats--; } virtual int GetAge() { return itsAge; } virtual void SetAge(int age) { itsAge = age; } static int HowManyCats; private: int itsAge; }; There are 5 cats left! Deleting the one which is 0 years old There are 4 cats left! Deleting the one which is 1 years old There are 3 cats left! Deleting the one which is 2 years old There are 2 cats left! Deleting the one which is 3 years old There are 1 cats left! Deleting the one which is 4 years old int Cat::HowManyCats = 0; void main() { const int MaxCats = 5; int i; Cat *CatHouse[MaxCats]; for (i = 0; i<MaxCats; i++) CatHouse[i] = new Cat(i); for (i = 0; i<MaxCats; i++) { cout << "There are " << Cat::HowManyCats << " cats left!\n"; cout << "Deleting the one which is " << CatHouse[i]->GetAge() << " years old\n"; delete CatHouse[i]; CatHouse[i] = 0; } }
Static Function – simple… class Cat { public: … static int GetNumberOfCats() { return HowManyCats; } static int HowManyCats; private: int itsAge; }; int Cat::HowManyCats = 4; void main() { int I = Cat::GetNumberOfCats(); }
Static Function – very complicated… class CBuf { public: int A; void CloseCompresBuf(); static void StaticCloseCompresBuf( void *B ) { ((CBuf *)B)->CloseCompresBuf(); } }; void CBuf::CloseCompressedBuf() { printf("A = %d\n", A ); } typedef *FUNC(void *); FUNC *gFunc; void *gParam; void Set_Timer_Timeout ( FUNC Func, void *Param ) { gFunc = Func; gParam = Param; } void Timer_timeout() { gFunc( gParam ); } void main() { CBuf *Buf1 = new CBuf; Buf1->A = 11; Set_Timer_Timeout( (FUNC *) CBuf::StaticCloseCompresBuf, Buf1 ); Timer_timeout(); // emulate interrupt }
Next week: Exercise / Homework: This was the basic foundation of C++ Spending ONLY 2.5 hours in class is NOT enough to master the foundation… The easiest way to memorize it and get more familiar with it is to – surprisingly simple - COPY all the samples and run them one by one on your PC. And based on this foundation… • More examples • MFC classes – CString etc… • Writing Windows application using CDialog
Implementing CDialog class CAboutDlg : public CDialog { public: CAboutDlg(); enum { IDD = IDD_ABOUTBOX };// Dialog Data protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP()
void Capp1Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } }
Next week: Exercise / Homework: This was the basic foundation of C++ Spending ONLY 2.5 hours in class is NOT enough to master the foundation… The easiest way to memorize it and get more familiar with it is to – surprisingly simple - COPY all the samples and run them one by one on your PC. And based on this foundation… • More examples • More MFC classes – CFile etc… • Windows application - Part 2