[c++_12_1]

·2022년 8월 25일
0

C++_Study

목록 보기
21/25

#220825 - 이어서 쭉쭉

12-1. 다중상속의 예(multiple inheritance)

  • 생성자는 기본클래스가 지정된 순서대로 왼 -> 오
  • 소멸자는 역순으로 실행

  • 다중상속
  • 생성자, 소멸사 순서
    • A1 생성자 -> A2 생성자 -> B생성자 -> B의소멸자 -> A2의 소멸자 -> A1의 소멸자
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 B:public A1, public A2{                   //아버지, 어머니 모두 public으로 받아옴!
    //기본 클래스 A1과 A2로부터 상속받은 파생 클래스 
    int c;                  //private
public:
    //각각 매개변수가 있고 받아오면 됨!
    B(int i, int j, int k):A1(i),A2(j) {c=k;}
    //i는 기본클래스 A1의 생성자료, j는 A2의 생성자료
    //각각 매개변수 전달
    void show(){
        std::cout << getA() << ' ' << getB() << ' ' << c << std::endl;
    }
};

int main()
{
    B bb(1,2,3);
    bb.show();
    return 0;
}

12-2. 상속클래스 다이어그램

  • 부모 -> 자식 (상속)
class Name{                     // 기본 클래스는 이름만 처리 
    std::string name; 
public: 
    void get_name(std::string s) {name=s;}
    void print_name() {std::cout << name << "의 전화번호는";}
};

class phone: public Name {      // 파생클래스는 전화번호 처리 (public으로 상속을 받고)
    std::string phone;
public:
    void get_phone(std::string s) {phone=s;}
    void print_phone(){
         print_name();
         std::cout << phone << " " << std::endl;
    }
};
int main(){
    phone h;
    h.get_name("smile Han");
    h.get_phone("1234-5678");
    h.print_phone();
    return 0;
}
Smile Han의 전화번호는 1234-5678

12-3. 상속 심화예제

  • 기본 클래스 Airship -> 운반할 수 있는 여행객의 수와 짐 저장

  • Airship 으로부터 파생된 클래스 Airplane -> 엔진의 종류 (프로펠러 or 제트) 운항거리 저장

  • Airship 으로부터 파생된 클래스 Balloon -> 기구를 들어올리는 데 사용되는 가스의 종류 (수소 or 헬륨)와 최대고도 저장

    • 각각 만드는 것보다 자식이 공통적으로 가지고 있는 것을 -> 부모에게 넣고 부모에게 상속받자
// Airship: 운반할 수 있는 '여행객의 수'와 '짐의 양'을 저장 
class Airship{
    protected:
        int passenger;
        double cargo; 
    public:
        void a_show();
};

void Airship::a_show()
{
    std::cout << "승객 수: " << passenger << std::endl;
    std::cout << "짐의 양: " << cargo << std::endl;
}

// Airplane: 엔진의 종류(프로펠러 또는 제트)와 운항 거리 저장  
class Airplane:public Airship{
    // private ??????
    char engine;
    double range;
public: 
    Airplane(int p, double c, char e, double r)
    {
        passenger=p;
        cargo=c;
        engine=e;
        range=r;
    }
    void show();
};
// Balloon: 기구를 들어올리는데 사용되는 가스의 종류(수소 or 헬륨) 
class Balloon:public Airship{
    char gas;
    double altitude;
public: 
    Balloon(int p, double c, char g, double a){
        passenger=p;
        cargo=c;
        gas=g;
        altitude=a;}
    void show();
};
void Airplane::show(){
    a_show();
    std::cout << "엔진 : ";
    // 'p'가들어가면 프로펠러, 아니면 제트
    std::cout << ((engine=='p') ? "프로펠러\n": "제트\n");
    std::cout << "운항 거리 : " << range << std::endl;
}
void Balloon::show(){
    a_show();
    std::cout << "가스: "; 
    // 'h'가 들어가면 가스 아니면 수소
    std::cout << ((gas=='h') ? "헬륨\n" : "수소\n");
    std::cout << "최대 고도 : " << altitude << std::endl;    
}
int main(){
    Airplane B747(200, 5000.0, 'j', 1000.0);
    Balloon b(4, 100.0, 'h', 5000.0);
    B747.show(); std::cout << std::endl;
    b.show();
    return 0;
}
승객 수: 200
짐의 양: 5000
엔진 : 제트
운항 거리 : 1000

승객 수: 4
짐의 양: 100
가스: 헬륨
최대 고도 : 5000
  • 응용예제2.
using std::string;

class Man{
protected:
    string name;
    int age;
public:
    Man(string n, int a){
        name = n;
        age = a;
    } 
    void m_show();
};

void Man::m_show()
{
    std::cout << "이름: " <<  name << std::endl;
    std::cout << "나이: " <<  age << std::endl;
}

class Student: public Man{
    string Ban;
    string Hak; 
public: 
    Student(string s, int a, string b, string h):Man(s,a)
    {
        Ban = b;
        Hak = h;
    }
    void s_show();
};

void Student::s_show(){
    m_show();
    std::cout << "반: " << Ban << std::endl;
    std::cout << "학번: " << Hak << std::endl; 
}

class Teacher: public Man{
    string Jun; 
    string Dam;
public:
    Teacher(string s, int a, string j, string d):Man(s,a)
    {
        Jun=j;
        Dam=d;
    }
    void t_show();    
};

void Teacher::t_show(){
    m_show();
    std::cout << "전공: " << Jun << std::endl;
    std::cout << "담당과목: " << Dam << std::endl;  
}

int main()
{
Student kks("김컴소", 20, "C반", "20114679");
Teacher hsh("한미소", 40, "전산", "C++프로그래밍");

kks.s_show();   
hsh.t_show();  
return 0;
}

이름: 김컴소
나이: 20: C반
학번: 20114679
이름: 한미소
나이: 40
전공: 전산
담당과목: C++프로그래밍

12-4. 오버로딩 vs 오버라이딩

  • 오버로딩: 클래스 안에 같은 이름의 함수가 여러개 있는 것
    생성자를 오버로딩하는 경우가 많고 매개변수의 자료형이나 갯수가 달라야 한다
class A{
private:
	int age;
public:
	A() {age=1;}
    A(int) {age=a;}
}
  • 오버라이딩: 부모쪽에서 virtual로 잡아주고 함수를 만들어 놓으면 자식이 똑같은 함수를 만들어놓으면 자식함수가 먼저 실행되는 것!
class A{
public:
	virtual int ss(int i) {return(i*2);}
};
class B: public A {
public:
	int ss(int i){return(i*3);}
};

profile
Hakuna Matata

0개의 댓글

관련 채용 정보