#include "animal.h" #include "monkey.h" #include "sea_otter.h" #include "sloth.h" #include using namespace std; int main() { // Monkey m; //m.print(); //option 1: simple upcasting the objects // Animal a = m; //upcasting // a.print(); // a.make_noise(4); //option 2: downcast //This doesn't even compile!!!! //Monkey m2 = a; //downcasting //option 3: pointers // Animal * a_ptr; // Monkey m2; // a_ptr = &m2; // a_ptr -> print(); // a_ptr -> make_noise(2); // Sloth s; // s.print(); // Sea_Otter o; // o.print(); //create an array of Animal* //Animal** a_arr = new Animal* [5]; //vec of Animal* vector a_arr; a_arr.push_back(new Monkey()); a_arr.push_back(new Sea_Otter()); a_arr.push_back(new Sloth()); a_arr.push_back(new Monkey()); a_arr.push_back(new Sloth()); // a_arr[0] = new Monkey(); // a_arr[1] = new Sea_Otter(); // a_arr[2] = new Sloth(); // a_arr[3] = new Monkey(); // a_arr[4] = new Sloth(); for (int i = 0; i < 5; i++) { //a_arr[i]->make_noise(2); a_arr[i]->print(); } //free the memeory for (int i = 0; i < 5; i++) { delete a_arr[i]; } // delete [] a_arr; // a_arr = nullptr; //Animal a; return 0; } //static binding: // 0x0000000000402827 main+29 mov -0x18(%rbp),%rax // 0x000000000040282b main+33 mov %rax,%rdi // 0x000000000040282e main+36 call 0x402480 <_ZN6Animal5printEv> // 0x0000000000402833 main+41 mov -0x18(%rbp),%rax // 0x0000000000402837 main+45 mov $0x2,%esi // 0x000000000040283c main+50 mov %rax,%rdi // 0x000000000040283f main+53 call 0x40243c <_ZN6Animal10make_noiseEi> //p m2 // $1 = { // = { // name = "monkey", // age = 5 // }, // members of Monkey: // tail_len = 1.2 // } //dynamic binding: // 0x0000000000402863 main+29 mov -0x18(%rbp),%rax // 0x0000000000402867 main+33 mov (%rax),%rax // 0x000000000040286a main+36 add $0x8,%rax // 0x000000000040286e main+40 mov (%rax),%rdx // 0x0000000000402871 main+43 mov -0x18(%rbp),%rax // 0x0000000000402875 main+47 mov %rax,%rdi // 0x0000000000402878 main+50 call *%rdx // 0x000000000040287a main+52 mov -0x18(%rbp),%rax // 0x000000000040287e main+56 mov (%rax),%rax // 0x0000000000402881 main+59 mov (%rax),%rdx // 0x0000000000402884 main+62 mov -0x18(%rbp),%rax // 0x0000000000402888 main+66 mov $0x2,%esi // 0x000000000040288d main+71 mov %rax,%rdi // 0x0000000000402890 main+74 call *%rdx //>>> p m2 // $1 = { // = { //--> _vptr.Animal = 0x404130 , // name = "monkey", // age = 5 // }, // members of Monkey: // tail_len = 1.2 // }