제 11 장상속 1. 상속의개념을이해한다. 2. 상속을이용하여자식클래스를작성할수있다. 3. 상속과접근지정자와의관계를이해한다. 4. 상속시생성자와소멸자가호출되는순서를이해한다.
이번장에서만들어볼프로그램 class Circle { int x, y; int radius;... class Rect { int x, y; int width, height;... 중복
상속의개요
상속의정의
예제 class Car { int speed; ; class SportsCar : public Car { bool turbo; ;
자식클래스와부모클래스
예제
예제 #include <iostream> #include <string> using namespace std; class Car { int speed; // 속도 public: ; void setspeed(int s) { speed = s; int getspeed() { return speed; // Car 클래스를상속받아서다음과같이 SportsCar 클래스를작성한다. class SportsCar : public Car { bool turbo; public: ; void setturbo(bool newvalue) { turbo = newvalue; bool getturbo() { return turbo;
예제 int main() { SportsCar c; c.setspeed(60); c.setturbo(true); c.setspeed(100); c.setturbo(false); return 0; // 부모클래스함수호출 // 자식클래스함수호출
상속은왜필요한가? 상속
상속계층도 상속은여러단계로이루어질수있다.
상속계층도
상속은 is-a 관계 상속은 is-a 관계 자동차는탈것이다. (Car is a Vehicle). 사자, 개, 고양이는동물이다. has-a( 포함 ) 관계는상속으로모델링을하면안된다. 도서관은책을가지고있다 (Library has a book). 거실은소파를가지고있다.
중간점검문제 1. 상속은왜필요한가? 2. 사자, 호랑이, 고양이를상속계층구조를이용하여표현하여보자.
Lab: 도형과사각형
예제 #include <iostream> using namespace std; class Shape { int x, y; public: void setx(int xval) { x = xval; void sety(int yval) { y = yval; ;
예제 class Rectangle : public Shape { int width, height; public: void setwidth(int w) { width = w; void setheight(int h) { height = h; int getarea() { return (width * height); ;
예제 int main() { Rectangle r; r.setwidth(5); r.setheight(6); cout << " 사각형의면적 : " << r.getarea() << endl; return 0;
상속에서의생성자와소멸자 자식클래스의객체가생성될때에당연히자식클래스의생성자는호출된다. 이때에부모클래스생성자도호출될까? SportsCar +speed +gear +color +setgear()() + speedup()() + speeddown()() -turbo : bool +setturbo()() 부모클래스 Car 에서상속받은부분 추가한부분
상속에서의생성자와소멸자
예제 class Shape { int x, y; public: Shape() { cout << "Shape 생성자 () " << endl; ~Shape() { cout << "Shape 소멸자 () " << endl; ; class Rectangle : public Shape { int width, height; public: Rectangle() { ~Rectangle() { ; cout << "Rectangle 생성자 ()" << endl; cout << "Rectangle 소멸자 ()" << endl;
예제 int main() { Rectangle r; return 0;
부모클래스의생성자를호출하는 방법
예제 Rectangle(int x=0, int y=0, int w=0, int h=0) : Shape(x, y) { width = w; height = h; Rectangle(int x=0, int y=0, int w=0, int h=0) : Shape(x, y), width(w), height(h) {
예제 class Shape { int x, y; public: Shape() { cout << "Shape 생성자 () " << endl; Shape(int xloc, int yloc) : x{xloc, y{yloc { cout << "Shape 생성자 (xloc, yloc) " << endl; ~Shape() { cout << "Shape 소멸자 () " << endl; ;
예제 class Rectangle : public Shape { int width, height; public: Rectangle::Rectangle(int x, int y, int w, int h) : Shape(x, y) { width = w; height = h; cout << "Rectangle 생성자 (x, y, w, h)" << endl; ~Rectangle() { cout << "Rectangle 소멸자 ()" << endl; ;
예제 int main() { Rectangle r(0, 0, 100, 100); return 0;
Lab: 컬러사각형 각형을 Rect 클래스로나타내자. 이클래스를상속받아서컬러사각형 ColoredRect 을정의해보자. ColoredRect 클래스를이용하여화면에다음과같은색깔있는사각형을그려보자.
예제 class Rect { protected: int x, y, width, height; public: Rect(int x, int y, int w, int h) : x(x), y(y), width(h), height(h) { void draw() { HDC hdc = GetWindowDC(GetForegroundWindow()); Rectangle(hdc, x, y, x + width, y + height); ;
예제 class ColoredRect : Rect { int red, green, blue; public: ColoredRect(int x, int y, int w, int h, int r, int g, int b) : Rect(x, y, h, w), red(r), green(g), blue(b) { void draw() { HDC hdc = GetWindowDC(GetForegroundWindow()); SelectObject(hdc, GetStockObject(DC_BRUSH)); SetDCBrushColor(hdc, RGB(red, green, blue)); Rectangle(hdc, x, y, x + width, y + height); ;
예제 int main() { Rect r1(100, 100, 80, 80); ColoredRect r2(200, 200, 80, 80, 255, 0, 0); r1.draw(); r2.draw(); return 0;
접근지정자
접근지정자
예제 class Person { string name; protected: string address; ; class Student : Person { public: void setaddress(string add) { address = add; string getaddress() { return address; ;
예제 int main() { Student obj; obj.setaddress(" 서울시종로구 1 번지 "); cout << obj.getaddress() << endl; return 0;
멤버함수재정의 자식클래스가필요에따라상속된멤버함수를재정의하여사용하는것을의미한다.
예제 #include <iostream> #include <string> using namespace std; class Animal { public: void speak() { cout << " 동물이소리를내고있음 " << endl; ; class Dog : public Animal { public: ; void speak() { cout << " 멍멍!" << endl;
예제 int main() { Dog obj; obj.speak(); return 0;
중복정의와재정의
부모클래스의멤버함수호출 #include <iostream> #include <string> using namespace std; class ParentClass { public: void print() { cout << " 부모클래스의 print() 멤버함수 " << endl; ; class ChildClass : public ParentClass { int data; public: void print() { // 멤버함수재정의 ParentClass::print(); cout << " 자식클래스의 print() 멤버함수 " << endl; ;
부모클래스를상속받는 3 가지방법
에제 #include <iostream> using namespace std; class Base { public: int x; protected: int y; private: int z; ; class Derived : private Base{ // x 는자식클래스에서사용가능하지만 private 로지정된다. // y 는자식클래스에서사용가능하지만 private 로지정된다. // z 는자식클래스에서도사용할수없다. ; int main() { Derived obj; cout << obj.x;
Lab: 게임에서의상속
에제 class Sprite { int x, y; string image; public: Sprite(int x, int y, string image) : x(x), y(y), image(image) { void draw() { void move() { ; class Alien : public Sprite { int speed; public: Alien(int x, int y, string image) : Sprite(x, y, image) { void move() { ;
에제 class Player : public Sprite { string name; public: Player(int x, int y, string image) : Sprite(x, y, image) { void move() { ; int main() { Alien a( 0, 100, "image1.jpg" ); Player p(0, 100, "image1.jpg"); return 0;
다중상속 다중상속 (multiple inheritance) 이란하나의자식클래스가두개이상의부모클래스로부터멤버를상속받는것을의미한다.
에제 class PassangerCar { public: int seats; // 정원 void set_seats(int n) { seats = n; ; class Truck { public: int payload; // 적재하중 void set_payload(int load) { payload = load; ;
에제 class Pickup : public PassangerCar, public Truck { public: int tow_capability; // 견인능력 void set_tow(int capa) { tow_capability = capa; ; int main() { Pickup my_car; my_car.set_seats(4); my_car.set_payload(10000); my_car.set_tow(30000); return 0;
Q & A