59
C++ Inheritance

C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

  • Upload
    others

  • View
    51

  • Download
    0

Embed Size (px)

Citation preview

Page 1: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

C++ Inheritance

Page 2: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

Bits & Bobs

Page 3: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

int x;int y;

intint

xy

struct { int x; int y;} pt;

intint

pt.xpt.y

pt

union { int x; int y;} pt;

int intpt.xpt.y

pt

Page 4: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

union { struct { int a; char b; } x; int y;} foo;

int intfoo.xfoo.y

foo

char

foo.x.afoo.x.b

Page 5: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

Why Inheritance?

Page 6: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

struct Circle { int x, y; int radius; void draw();};

struct Square { int x, y; int width; void draw();};

Page 7: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

struct Circle { int x, y; int radius; void draw();};

struct Square { int x, y; int width; void draw();};

Circle *circles[nc];Square *squares[ns];

Page 8: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

for(int i = 0; i < nc; i++) circles[i].draw();for(int i = 0; i < ns; i++) squares[i].draw();

struct Circle { int x, y; int radius; void draw();};

struct Square { int x, y; int width; void draw();};

Circle *circles[nc];Square *squares[ns];

Page 9: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

Circle *circles[nc];Square *squares[ns];

for(int i = 0; i < nc; i++) circles[i].draw();for(int i = 0; i < ns; i++) squares[i].draw();

for(int i = 0; i < nc; i++) delete circles[i];for(int i = 0; i < ns; i++) delete squares[i];

for(int i = 0; i < nc; i++) printf("%d\n", circles[i].width);

Page 10: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

struct Circle { int x, y; int radius; void draw();};

struct Square { int x, y; int width; void draw();};

Shape *shapes[ns];

for(int i = 0; i < ns; i++) shapes[i].draw();

for(int i = 0; i < ns; i++) delete shapes[i];

??

Page 11: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

Inheritance

Page 12: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Shape {public: virtual void draw() = 0;};

class Circle : public Shape {private: int x, y; int radius;public: virtual void draw();};

void Circle::draw() { ...} Best Practice

Page 13: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

1) Subclassing2) virtual

Page 14: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

1) Subclassing2) virtual

Page 15: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

1) Subclassing

inherit behavior from the parent

Page 16: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Shape {public: void draw();};

class Circle : public Shape {public: int getRadius();};

int main() { Circle circle; circle.draw();}

Page 17: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

void draw()

Shape

void draw()

int getRadius()

Circle : public Shape

Page 18: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

1) Subclassing

inherit fields from the parent

Page 19: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Shape {public: int x, y;};

class Circle : public Shape {public: int radius;};

int main() { Circle circle; circle.x = 5;}

Page 20: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

int x

int y

Shape

int x

int y

int radius

Circle : public Shape

Page 21: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

Shapeint x

int y

int radius

Circle{ }is-a or has-a?

Page 22: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Circle {public: Shape shape; int radius;};

class Circle : public Shape {public: int radius;};

Page 23: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Circle {public: Shape shape; int radius;};

circle.shape.x;

class Circle : public Shape {public: int radius;};

circle.x;

Page 24: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

1) Subclassing

public/protected/private fields

Page 25: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Shape {public: int x;private: int y;};

void Circle::foo() { printf("%d", x); printf("%d", y); // compile error}

only accessible inShape class

Page 26: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Shape {public: int x;protected: int y;};

void Circle::foo() { printf("%d", x); printf("%d", y);}

int main() { Circle circle; circle.x = 0; // compile error}

accessible in Shape classand in subclasses

Page 27: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

1) Subclassing

public/protected/private inheritance

Page 28: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Shape {public: void draw();};

class Circle : public Shape {};

Page 29: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Shape {public: void draw();};

class Circle : protected Shape {};

Page 30: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Shape {public: void draw();};

class Circle : protected Shape {protected: int getRadius();};

The inheritance is protected.If you can access getRadius(), you can access draw()

Page 31: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Shape {public: void draw();};

class Circle : private Shape {private: int getRadius();};

The inheritance is private.If you can access getRadius(), you can access draw()

Page 32: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

private inheritance:is-a or has-a

Page 33: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

1) Subclassing

multiple inheritance

Page 34: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Color {public: virtual void print();};

class Mood {public: virtual void print();};

class Blue : public Color, public Mood {public: virtual void print() { this->Color::print(); this->Mood::print(); }};

Page 35: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

1) Subclassing

slicing

Page 36: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

struct Cow { void speak() { printf("Moo.\n"); }};

struct Werecow : public Cow { bool transformed; void speak() { if (transformed) printf("Aaooooh!\n"); else printf("Moo.\n"); }};

Page 37: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

Werecow wcow;wcow.transformed = true;

Cow cows[2];cows[0] = Cow();cows[1] = wcow;

for (int i = 0; i < 2; i++) cows[i].speak();wcow.speak();

// Output:// Moo.// Moo.// Aaooooh!

Page 38: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

void poke(Cow cow) { cow.speak();}

Cow judy;Werecow bev;bev.transformed = true;

poke(judy);poke(bev);bev.speak();

// Output:// Moo.// Moo.// Aaooooh!

Page 39: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

bool transformed

Cow Werecow

Page 40: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

Use pointersUse virtual

Page 41: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

1) Subclassing2) virtual

Page 42: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Shape {public: void draw() { printf("shape\n"); }};

class Circle : public Shape {public: void draw() { printf("circle\n"); }};

Page 43: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Shape {public: void draw() { printf("shape\n"); }};

class Circle : public Shape {public: void draw() { printf("circle\n"); }};

Circle *circle = new Circle;circle->draw(); // "circle"

Page 44: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Shape {public: void draw() { printf("shape\n"); }};

class Circle : public Shape {public: void draw() { printf("circle\n"); }};

Shape *shape = new Circle;shape->draw(); // "shape"

Page 45: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Shape {public: void draw() { printf("shape\n"); }};

class Circle : public Shape {public: void draw() { printf("circle\n"); }};

Shape *shape = new Circle;shape->draw(); // "shape"

draw() is non-virtual,so it’s compiled like a C call

Page 46: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

Non-virtual functions aredetermined at compile-time

class Cat {public: void yawn(int duration);};

Cat cat, *pcat = new SuperCat;cat.yawn(4);pcat->yawn(4);

Both use Cat::yawnbecause both have type Cat

Page 47: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

Virtual functions aredetermined at run-time

class Cat {public: virtual void yawn(int duration);};

Cat cat, *pcat = new SuperCat;cat.yawn(4);pcat->yawn(4);

Use Cat::yawn and SuperCat::yawn(pcat’s type is checked every time it’s called)

Page 48: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

non-virtual: compile-timevirtual: run-time

Page 49: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

2) virtual

pure virtual methods

Page 50: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Shape {public: virtual void draw() = 0;};

int main() { Shape shape;}

pure.cpp: In function ‘int main()’:pure.cpp:7: error: cannot declare variable ‘shape’ to be of abstract type ‘Shape’pure.cpp:1: note: because the following virtual functions are pure within ‘Shape’:pure.cpp:3: note: ! virtual void Shape::draw()

Page 51: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Drawable {public: virtual void draw() = 0;};

class Fish : public Drawable {public: virtual void draw();};

int main() { Drawable *drawables[3]; drawables[0] = new Fish; drawables[1] = new Salami; drawables[2] = new JackSparrow;}

Page 52: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

2) virtual

destructors

Page 53: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

Make virtual destructors

class Fish {public: Fish() { gills[0] = new Gill; gills[1] = new Gill; } virtual ~Fish() { delete gills[0]; delete gills[1]; }private: Gill *gills[2];};

Page 54: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

2) virtual

virtual inheritance

Page 55: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Goofball { int x;};

class Stupid : public Goofball { };class Dumb : public Goofball { };

class Oops : public Stupid, public Dumb {};

Stupid::x

Dumb::x

Oops

Page 56: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Goofball { int x;};

class Stupid : public Goofball { };class Dumb : public Goofball { };

class Oops : public Stupid, public Dumb { int fail();};

int Oops::fail() { Stupid::x = 1; Dumb::x = 2; return Stupid::x + Dumb::x; // 3}

Page 57: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Goofball { int x;};

class Stupid : virtual public Goofball { };class Dumb : virtual public Goofball { };

class Oops : public Stupid, public Dumb { int fail();};

int Oops::fail() { Stupid::x = 1; Dumb::x = 2; return Stupid::x + Dumb::x; // 4}

Page 58: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

Conclusion

Page 59: C++ Inheritanceweb.mit.edu/6.s096/www/iap13/lectures/6/6.s096-lecture6.pdf · C++ Inheritance. Bits & Bobs. int x; int y; int int x y struct {int x; int y;} pt; int int pt.x pt.y

class Shape {public: virtual void draw() = 0;};

class Circle : public Shape {private: int x, y; int radius;public: virtual void draw();};

void Circle::draw() { ...} Best Practice