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;
}
'basic > C++' 카테고리의 다른 글
7. 프렌드와 연산자 중복 (비어있습니다) (0) | 2018.05.17 |
---|---|
6. 함수중복과 static멤버 (0) | 2018.05.15 |
5. 함수와 참조, 복사생성자 (0) | 2018.05.03 |
4. 객체 포인터와 객체배열, 객체의 동적생성 (0) | 2018.04.10 |
3. 클래스와 객체 (0) | 2018.03.22 |