상속
기본클래스로부터 멤버를 상속받아 재활용하는것
class A : public B{
};
c++ 에서 상속은 다른 언어의 상속과 조금 다르다.
상속할때 접근 속성을 지정할수가 있다.
private
protected
public
기본접근속성 상속접근속성 |
private |
protected |
public |
private |
상속불가 |
상속불가 |
상속불가 |
protected |
private |
protected |
protected |
public |
private |
protected |
public |
기본접근속성이 private로 설정되있는경우 public속성인 멤버함수에 의해 간접접근이 가능하다.
#include <iostream> using std::cout; using std::endl; class A { int x; public : void SetX(int i){x=i;} void ShowX(){cout<<x<<endl;} }; class B:public A { int y; public: void SetY(int i){y=i;} void ShowXY(){cout<<x<<y<<endl;}//에러 }; void main() { B bb; bb.SetX(1); // 기본클래스의 멤버접근 bb.SetY(2); // 파생클래스의 멤버접근 bb.ShowX(); // 기본클래스의 멤버접근 bb.ShowXY(); // 파생클래스의 멤버접근 } | cs |
#include <iostream> using std::cout; using std::endl; class A { int x; public : void SetX(int i){x=i;} void ShowX(){cout<<x<<endl;} }; class B:private A //비공개적으로 상속 { int y; public: void SetY(int i){y=i;} void ShowY(){ cout<<y<<endl;} }; void main() { A aa; B bb; aa.SetX(1); aa.ShowX(); bb.SetX(1); // 오류 bb.SetY(2); // 파생클래스의 멤버접근 bb.ShowX(); // 오류 bb.ShowY(); // 파생클래스의 멤버접근 } | cs |
#include <iostream> using std::cout; using std::endl; class A { protected : //private이라면? int a,b; public : void SetAB(int i, int j){a=i;b=j;} }; class B:public A { int c; // private public: void SetC(int n){c=n;} void ShowABC(){cout<<a<<b<<c<<endl;} //기본 클래스의 protected 멤버들은 //파생 클래스의 멤버에 의해 접근될 수 있다. }; void main() { A aa; B bb; //aa.a; //외부에서는 직접접근불가 //bb.b; //외부에서는 직접접근불가 bb.SetAB(1,2); bb.SetC(3); bb.ShowABC(); } | cs |
생성자 소멸자 호출순서
#include <iostream> using std::cout; class A { public : A(){cout<<"A의 생성자 ";} ~A(){cout<<"A의 소멸자 ";} }; class B:public A { public: B(){cout<<"B의 생성자 ";} ~B(){cout<<"B의 소멸자 ";} }; void main() { B ob; } | cs |
순서
생성자:부모 -->> 자식
소멸자:부모 <<-- 자식
기본클래스의 생성자에 매개변수가 있는경우
#include <iostream> using std::cout; using std::endl; class A{ int a; public : A(int i){ cout<<"A의 생성자\n"; a=i; } ~A(){cout<<"A의 소멸자\n";} void ShowA(){cout<<a<<'\n';} }; class B:public A{ int b; public: B(int i, int j):A(i) {// i는 기본클래스 생성자의 매개변수로 전달 cout<<"B의 생성자\n"; b=j;} ~B(){cout<<"B의 소멸자\n";} void ShowB(){cout<<b<<endl;} }; void main() { B bb(10,20); bb.ShowA(); bb.ShowB(); } | cs |
생성자 중첩과 상속
#include <iostream> using std::cout; using std::endl; class A{ int a; public : A(int i){ cout<<"A의 생성자\n"; a=i; } A(){a=1;} ~A(){cout<<"A의 소멸자\n";} void ShowA(){cout<<a<<'\n';} }; class B:public A{ int b; public: B(int j){// i는 기본클래스 생성자의 매개변수로 전달 cout<<"B의 생성자\n"; b=j;} B(int i, int j):A(i) {// i는 기본클래스 생성자의 매개변수로 전달 cout<<"B의 생성자\n"; b=j;} ~B(){cout<<"B의 소멸자\n";} void ShowB(){cout<<b<<endl;} }; void main() { B bb(10,20); bb.ShowA(); bb.ShowB(); } | cs |
디폴트인자와 상속
#include <iostream> using std::cout; using std::endl; class A{ int a; public : A(int i){ cout<<"A의 생성자\n"; a=i; } ~A(){cout<<"A의 소멸자\n";} void ShowA(){cout<<a<<'\n';} }; class B:public A{ int b; public: B(int j, int i=1):A(i) {// i는 기본클래스 생성자의 매개변수로 전달 cout<<"B의 생성자\n"; b=j;} ~B(){cout<<"B의 소멸자\n";} void ShowB(){cout<<b<<endl;} }; void main() { B bb(10,20); bb.ShowA(); bb.ShowB(); } | cs |
계층적 다중상속
#include <iostream> using std::cout; using std::endl; class B{ //할아버지 double d; public : B(double dd){d=dd;} double GetD() {return d;} }; class D1:public B{ //아버지 int i; public: D1(double dd, int ii) :B(dd) {i=ii;} int GetI() {return i;} }; class D2:public D1{ //아들 char c; public: D2(double dd, int ii, char cc) :D1(dd,ii) {c=cc;} void Print(){ cout<< "Double : "<<GetD()<<endl; // B 멤버 호출 cout<< "Int : "<<GetI()<<endl; // D1 멤버 호출 cout<< "Char : "<<c<<endl; } }; void main() { D2 d2(35.76,100,'H'); cout<<d2.GetD()<<','<<d2.GetI()<<endl; // B, D1 멤버 호출 d2.Print(); } | cs |
다중상속
#include <iostream> using std::cout; using std::endl; class A1 // 아버지 { int a; public : A1(int i){a=i;} int GetA(){return a;} }; class A2 // 어머니 { int b; public: A2(int i){b=i;} int GetB(){return b;} }; class A3 { int b; public: A3(int i){b=i;} int GetB(){return b;} }; class B:public A1, public A2 ,public A3 { // 기본 클래스 A1과 A2로부터 // 상속 받은 파생 클래스 int c; public: B(int i, int j, int k):A1(i), A2(j), A3(k) {c=k;} // i는 기본클래스 A1의 생성자로, // j는 기본클래스 A2의 생성자로 // 각각 매개변수 전달 void Show(){ cout<<GetA()<<' '<<A2::GetB()<<' '<<c<<endl; } }; void main() { B bb(1,2,3); bb.Show(); } | cs |
다중상속 생성자 소멸자 순서
#include <iostream> using std::cout; class A1 // 기본 클래스 1 { int a; public : A1(){cout<<"A1의 생성자.\n";} ~A1(){cout<<"A1의 소멸자.\n";} }; class A2 // 기본 클래스 2 { int b; public: A2(){cout<<"A2의 생성자.\n";} ~A2(){cout<<"A2의 소멸자.\n";} }; class A3 // 기본 클래스 2 { int b; public: A3(){cout<<"A3의 생성자.\n";} ~A3(){cout<<"A3의 소멸자.\n";} }; class B: public A1, public A2, public A3 // 기본 클래스 1,2,3로부터 // 상속 받은 파생 클래스 { int c; public: B(){cout<<"B의 생성자.\n";} ~B(){cout<<"B의 소멸자.\n";} }; void main() { B bb; } | cs |
생성자 -->>
소멸자 <<--
예제소스
#include <iostream> using std::cout; using std::endl; class Airship{ protected: int passengers; double cargo; public : void A_Show(); }; void Airship::A_Show() { cout<<"승객 수 : "<<passengers<<endl; cout<<"짐의 양 : "<<cargo<<endl; } class Airplane : public Airship{ char engine; double range; public: Airplane(int p, double c, char e, double r) { passengers=p; cargo=c; engine=e; range=r; } void Show(); }; void Airplane::Show(){ A_Show(); cout<<"엔진 : "; cout<<((engine=='p') ? "프로펠러\n" : "제트\n"); cout<<"운항 거리 : "<<range<<endl; } class Balloon : public Airship{ char gas; double altitude; public: Balloon(int p, double c, char g, double a){ passengers=p; cargo=c; gas=g; altitude=a;} void Show(); }; void Balloon::Show(){ A_Show(); cout<<"가스 : "; cout<<((gas=='o') ? "수소\n" : "헬륨\n"); cout<<"최대 고도 : "<<altitude<<endl; } void main(){ Airplane B727(100,40000.0, 'j',40000.0); Balloon b(3, 200.0, 'h',10000.0); B727.Show();cout<<endl; b.Show(); } | cs |
'2학년 1학기 > 윈도우즈프로그래밍II' 카테고리의 다른 글
c++ 클래스 설계해보기 (0) | 2015.05.06 |
---|---|
20150415 - 윈도우즈프로그래밍 II - 7주차 (0) | 2015.04.15 |
20150401 윈도우즈프로그래밍II - 5주차 (0) | 2015.04.01 |
20150325 윈도우즈프로그래밍II 4주차 (0) | 2015.03.25 |
전형적인 C프로그램 소스코드 (0) | 2015.03.25 |