1. 상속의 장점 : 상속은 동일한 코드를 여러번 중복 할 필요 없이 상속관계로 선언하면 물려 받기만 하면 되는 간결함이라는 장점이 있다. 또한 클래스 관계를 계층 관계로 표현 함으로써 프로그램의 구조적인 관계 파악을 쉽게 해준다. 가장 큰 장점은 역시 재사용성이 좋고 소프트웨어의 생산성을 향상 시켜준다는 장점이 있다.  


2. 상속의 예 (예제 8-1 소스코드, 주석)


#include <iostream>

#include <cstdlib> 


using namespace std;


class Point{

int x, y; //x, y의 좌표값

public :

void set(int x, int y){

this->x=x;

this->y=y;

}

void showPoint(){

cout << "(" << x << ", " << y << ")" << endl;

}

};


class colorPoint : public Point{

string color;

public:

void setColor(string color){

this->color=color;

}

void showColorPoint(){

cout << color << ": ";

showPoint(); //기본 클래스의 맴버 함수를 호출한다. 

}

};


int main(int argc, char** argv) {

Point p; //기본 클래스의 객체 p를 생성한다.

colorPoint cp; //파생 클래스의 객체 cp를 생성한다.

//재사용성 확인하기

cp.set(3,4);

cp.setColor("Red");

cp.showColorPoint(); 

return 0;

}



3. 상속관계에서 생성자의 실행 예(예제코드, 주석, 실행결과)


#include <iostream>


using namespace std; 


class A{

int x;

public:

A(){

x = 0;

}

A(int x){

this->x = x;

cout << "A 맴버 변수 x = " << x << endl;

}

};


class B : public A{

int y;

public:

B(int x, int y) : A(x+5){

this->y =y;

cout << "B 맴버 변수 x = " << x << " B 맴버 변수 y = "<< y << endl;

}

};


class C : public B{

int m;


public:

C(int x, int y, int z) : B(x, y){

m = x*y*z;

cout << "C 맴버 변수 x = " << x << " C 맴버 변수 y = "<< y << " C 맴버 변수 m = "<< m << endl;

}

};


int main(int argc, char** argv) {

C c(3,5,2); //c 객체의 생성자 호출순서는 C > B > A 로 거슬러 올라가서 생성자의 실행 순서는 A > B > C 순으로 된다. 이 과정에서 A의 매개변수가 있는 생성자가 호출 될 때 A의 맴버 변수 x 의 값이 8이 되고 그 다음 실행 되는 B의 생성자에서 B의 맴버 변수가 x는 3 y는 5가 되고 마지막으로 C의 생성자가 실행되어 C의 맴버 변수 x는 3 y는 5 m 은 30이 됩니다. 

한눈에 알아보기 쉬운 실행결과 참조

cout << endl;

B b(3,4);

return 0;

}



4. 동적바인딩의 조건(예제코드, 주석, 실행결과)

1) 파생 클래스의 함수를 오버라이딩 한다.(virtual 키워드를 사용) 

2) 업캐스팅을 시켜준다.

(1과 2번의 조건은 프로그램에서 코딩해야하는 것)


#include <iostream>


using namespace std; 


class Shape{ //base class 기본 클래스

//오버라이딩 시키기 위하여 virtual 키워드를 붙인다. (가상 함수 임을 나타냄) 

public:

virtual void draw()= 0; //순수가상함수란 선언만하는 가상함수이다. 상속받는 파생클래스는 반드시 구현해서 사용 해야만 한다. 

//c++ 에서는 순수가상함수를 가지는 클래스를 추상클래스라고 한다. 

/*{

cout << " 도형을 그린다. " << endl;

}*/

}; 


class Circle:public Shape{ //derive class 파생 클래스 

//오버라이딩 : 기본 클래스의 맴버 함수를 파생 클래스에서 재정의 한다. 

public:

virtual void draw(){

cout << " 원을 그린다. " << endl;

}

};

//동적바인딩의 조건 

//1.파생 클래스의 함수를 오버라이딩 한다.(virtual 키워드를 사용) 

//2.업캐스팅을 시켜준다. (1과 2번의 조건은 프로그램에서 코딩해야하는 것) 

class Rect:public Shape{

public:

virtual void draw(){

cout << " 사각형을 그린다. " << endl;

}

};


int main(int argc, char** argv) {

//실습 1 : 맴버 함수 호출 

//heap영역에 할당되고 결과로 주소 즉 포인터가 넘어오기 때문에 받을때 포인터 변수로 받는다. 

//Shape *p = new Shape(); //new 동적할당 

//p->draw(); //실행결과 : 도형을 그린다. (기본 클래스의 내용이 출력된다.) 

//실습 2 : 오버라이딩 된 결과 확인

Shape *q = new Circle();

q->draw(); //실행결과 : 원을 그린다. 

Shape *r = new Rect();

r->draw(); //실행결과 : 사각형을 그린다. 

//업캐스팅이란 파생 클래스에서 생성된 포인터를 기본 클래스의 포인터로 보내준다. 

return 0;

}


+ Recent posts