Programing/C- programing

C++ - 포함과 상속

sosal 2010. 12. 28. 07:07
반응형

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */

객체지향 상속관련해서 포스팅을 한적이 없더라구요~
복습할겸 끄적여봅니다 ㅎㅎ

아래는 x,y 좌표를 저장하는 객체를 만든 모습입니다.

#include<iostream>
#include<cstring>

using namespace std;

class point{
private:
    int x,y;
public:
    point(int _x,int _y):x(_x),y(_y){};
    int getX(){
        return x;
    }
    int getY(){
        return y;
    }
};

int main(){
    point a(3,5);
    printf("%d %d",a.getX(),a.getY());
    return 0;
}

C++ 프로그래밍 경험이 있으신분들은 위 코드를 쉽게 이해하실거라 생각합니다.

아.. 생성자 부분에서 낯선부분이라고 생각하실 수 있는게..
point(int _x,int _y):x(_x),y(_y){}; // 이부분일까요?
point(int _x,int _y){
    x = _x;
    y = _y;
} 와 완벽히 같은 내용입니다.

x = _x; // C style definition.
x(_x); // C++ style definition

위의 point 객체를 '포함' 하는 직사각형 객체 rectangle를 만들어봅시다.
단순히 point 객체를 변수로 가지는 직사각형 객체입니다.

#include<iostream>
#include<cstring>
using namespace std;

class point{
private:
    int x,y;
public:
    point(int _x,int _y):x(_x),y(_y){};
    int getX(){
        return x;
    }
    int getY(){
        return y;
    }
};

class rectangle{
private:
    point topLeft;
    point bottomRight; //point 객체 '포함'
public:
    rectangle(int a,int b,int c,int d):topLeft(a,b),bottomRight(c,d){};
    void print(){
        printf("Top Left : (%d , %d)\n",topLeft.getX(),topLeft.getY());
        printf("Bottom Right : (%d , %d)\n",bottomRight.getX(),bottomRight.getY());
    }
};

int main(){
    rectangle myRec(1,2,3,4);
    myRec.print();
    return 0;
}

rectangle 객체는 각 꼭지점의 위치를 point 객체를 이용하여 저장하고 있습니다.
객체가 다른 객체를 멤버변수로 사용하고 있는것을 '포함' 이라고 합니다.



아래는, 포함과 상속 모두를 사용한 예제입니다.
circle 객체는 point 객체를 '포함' 하여, 중심 좌표를 가지며
figure 객체를 상속하고 있습니다.
즉 circle 객체는 figure의 모든 public, protect 멤버에 대해서 접근이 가능합니다.
그중 protect는 상속받는 객체만이 public처럼 접근이 가능하고,
외부에서 protect변수는 private처럼 접근이 불가능합니다.
(circle이 figure을 상속받음)

#include<iostream>
#include<cstring>

using namespace std;

class point{
private:
    int x,y;
public:
    point(int _x,int _y):x(_x),y(_y){};
    int getX(){
        return x;
    }
    int getY(){
        return y;
    }
};

class figure{
private:
    char Name[20];
protected:
    char protect[50];
public:
    figure(char *_Name){
        strcpy_s(Name,_Name);
    }
    const char* getName() const{
        return Name;
    }
};

class circle : public figure // <-- 상속하는 부분
{
private:
    point center;
    int radius;
public:
    circle(int x,int y,int _radius)
        :center(x,y),figure("원"),radius(_radius){};
    void showData(){
        printf("%s 입니다.\n",getName()); //<-- figure 객체의 함수를 사용!
        printf("(x,y) : (%d,%d)\n",center.getX(),center.getY());
        printf("Radius : %d\n",radius);
        strcpy(protect,"protect는 마치 public처럼 접근가능!"); //Protect변수 접근가능
        printf("%s\n",protect);
    }
};

int main(){
    circle myCircle(5,5,5);
    myCircle.showData();
    return 0;
}