LANG/C++

[C++]07-2.상속의 문법적인 이해

혀니리리 2023. 5. 14. 14:48
728x90

상속이란?

A클래스가 B클래스를 상속하게 되면, A는 B가 가지고 있는 모든 멤버를 물려받는다.

즉, A는 A멤버 + B멤버도 같이 가지게 됨.

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

class Person
{
private:
    int age; //나이
    char name[50]; //이름
public:
    Person(int myage, char *myname):age(myage)
    {
        strcpy(name, myname);
    }
    void WhatYourName() const
    {
        cout <<"My name is " << name <<endl;
    }
    void HowOldAreYou() const
    {
        cout <<"I'm " <<age <<" years old" <<endl;
    }
};

class UnivStudent:public Person //Person클래스의 상속을 의미
{
private:
    char major[50]; //전공과목
public:
    UnivStudent(char *myname, int myage, char *mymajor)
    :Person(myage, myname)
    {
        strcpy(major, mymajor);
    }
    void WhoAreYou() const
    {
        WhatYourName(); //Person의 멤버함수이기에 호출 가능!
        HowOldAreYou();
        cout <<"My major is "<<major <<endl <<endl;
    }
};

int main(void)
{
    UnivStudent ustd1("Lee", 22, "Computer eng.");
    ustd1.WhoAreYou();
    
    UnivStudent ustd2("Yoon", 21, "Electronic eng.");
    ustd2.WhoAreYou();
    return 0;
}

1.용어의 정리

Person                <->   UnivStudent

상위 클래스                  하위 클래스

기초(base)클래스         유도(derived)클래스

슈퍼(super)클래스        서브(sub)클래스

부모 클래스                   자식 클래스

 

2.유도클래스의 객체 생성과정

#include <iostream>
using namespace std;

class SoBase
{
private:
    int baseNum;
public:
    SoBase(): baseNum(20)
    {
        cout <<"SoBase()" <<endl;
    }
    SoBase(int n): baseNum(n)
    {
        cout <<"SoBase(int n)" <<endl;
    }
    void ShowBaseData()
    {
        cout << baseNum <<endl;
    }
};

class SoDerived:public SoBase
{
private:
    int derivNum;
public:
    SoDerived() : derivNum(30)
    {
        cout <<"SoDerived()" <<endl;
    }
    SoDerived(int n) : derivNum(n)
    {
        cout <<"SoDerived(int n)" <<endl;
    }
        SoDerived(int n1, int n2) : SoBase(n1), derivNum(n2)
    {
        cout <<"SoDerived(int n1, int n2)" <<endl;
    }
    void ShowDerivData()
    {
        ShowBaseData();
        cout <<derivNum <<endl;
    }
};

int main(void)
{
    cout <<"case1...." <<endl;
    SoDerived dr1;
    dr1.ShowDerivData();
    cout <<"------------------" <<endl;
    cout <<"case2...." <<endl;
    SoDerived dr2(12);
    dr2.ShowDerivData();
    cout <<"------------------" <<endl;
    cout <<"case3...." <<endl;
    SoDerived dr3(23, 24);
    dr3.ShowDerivData();
    return 0;
}

1) 유도클래스의 객체 생성과정에서 기초 클래스의 생성자는 100% 호출됨 (SoBase())

2) 유도클래스의 생성자에서 기초 클래스의 생성자 호출을 명시하지 않으면, 기초클래스의 void생성자가 호출됨

 

1)유도 클래스의 객체가 소멸될 때에는, 유도클래스의 소멸자가 실행되고 난 다음에 기초클래스의 소멸자가 실행된다.

2)스택에 생성된 객체의 소멸순서는 생성순서와 반대.

 

728x90