View
218
Download
2
Tags:
Embed Size (px)
Citation preview
C++ for the MFE class at UC Berkeley
Session #2
Yuli Kaplunovsky MFE, MBA, MS-Tax, CFA
(408) 884 5965
2
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";}
3
Inheritance: Overriding Functionsclass 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;};
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;};
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...
4
Pointer to a class
void PrintDogsAge( Dog * P ){ printf("The age of the ” “Dog is: %d \n", P->GetAge(); }
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();}Exercise: Write the output of this program
5
Virtualclass 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;};
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"; }
};
int main(){ Mammal *pDog = new Dog; pDog->Move(); pDog->Speak();}
Mammal constructor...Dog Constructor...Mammal move one stepWoof!
Dog Fido; Fido.Move(); Fido.Speak();
Mammal constructor...Dog Constructor...Dog moves 5 stepsWoof!Dog destructorMammal destructor
6
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.
7
Static variablesclass 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;};
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; }}
There are 5 cats left!Deleting the one which is 0 years oldThere are 4 cats left!Deleting the one which is 1 years oldThere are 3 cats left!Deleting the one which is 2 years oldThere are 2 cats left!Deleting the one which is 3 years oldThere are 1 cats left!Deleting the one which is 4 years old
8
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();}
9
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}
10
Next week:
• More examples
• MFC classes – CString etc…
• Writing Windows application using CDialog
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…
26
class CAboutDlg : public CDialog{public:
CAboutDlg();enum { IDD = IDD_ABOUTBOX }; // Dialog Data
protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV
support// Implementationprotected:
DECLARE_MESSAGE_MAP()};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){}
void CAboutDlg::DoDataExchange(CDataExchange* pDX){
CDialog::DoDataExchange(pDX);}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()
Implementing CDialog
27
void Capp1Dlg::OnSysCommand(UINT nID, LPARAM lParam){
if ((nID & 0xFFF0) == IDM_ABOUTBOX){
CAboutDlg dlgAbout;dlgAbout.DoModal();
}else{
CDialog::OnSysCommand(nID, lParam);}
}
28
Next week:
• More examples• More MFC classes – CFile etc…• Windows application - Part 2
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…