본문 바로가기

2학년 1학기/윈도우즈프로그래밍II

20150506 - 윈도우즈프로그래밍II - 10주차

상속

기본클래스로부터 멤버를 상속받아 재활용하는것


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(3200.0'h',10000.0);
    B727.Show();cout<<endl;
    b.Show();
}
cs