상속의 기본

조한별·2022년 4월 11일
0

클래스의 속성 중 한개인 상속을 사용하기 위해서는 부모클래스와 자식클래스를 지정해줘야 한다. 자식클래스는 부모클래스의 멤버를 사용할 수 있지만 부모클래스에서는 접근이 불가능하다. 자식클래스에서 부모클래스의 멤버에 접근하기 위해서는 접근지정자 public이나 protected로 선언을 해줘야만 한다.

#include <iostream>

using namespace std;

class Base
{
protected:
    //protected로 선언된 멤버는 자식 클래스에서는 접근이 가능하나 외부에선 접근이 불가능하게 해주는 접근지정자다.
    int _num;

public:
    Base()
    {
        cout << "Base" << endl;
    }
    Base(int num) : _num(num)
    {
        cout << "Base(int)" << endl;
    }

    ~Base()
    {
        cout << "~Base" << endl;
    }
};

class Derived : public Base
{
public:
    //멤버 이니셜라이즈로 따로 부모클래스의 생성자를 지정하지 않을 경우에는
    //파라미터가 없는 기본 생성자로 설정이 된다.     ex) Base::Base() {}
    //그래서 만약 Base()가 따로 선언이 안되어 있는 경우엔 에러가 발생할 수 있다.
    Derived()                       
    {
        cout << "Derived" << endl;
        this->_num = 10;            //가급적이면 부모 클래스 멤버는 부모 클래스에서 정의하는 것이 좋다.
    }
    Derived(int num): Base(num)
    {
        cout << "Derived(int)" << endl;
    }

    ~Derived()
    {
        cout << "~Derived" << endl;
    }
};

int main()
{
    Derived d;

    Derived e(30);
}

결과

Base
Derived
Base(int)
Derived(int)
~Derived
~Base
~Derived
~Base

이 코드에선 기본적인 상속의 사용법과 객체 생성 및 소멸 시기를 알 수 있다.
자식클래스에서 using을 이용해서 생성할 수 있다.

#include <iostream>

using namespace std;

class Base
{
private:
    int _num;

public:
    Base() : _num(0)
    {
        cout << "Base" << endl;
    }
    Base(int num) : _num(num)
    {
        cout << "Base(int)" << endl;
    }

    ~Base()
    {
        cout << "~Base" << endl;
    }
};
class Derived :public Base
{
public:
    using Base::Base;
    
    //디폴트 생성자를 사용하기 싫은 경우엔 이 코드를 삽입하면 의도적으로 디폴트 생성자를 사용 안할 수 있게 된다.
    Derived() = delete;

    ~Derived()
    {
        cout << "~Derived" << endl;
    }
};

이렇게 코딩을 해도 잘 작동한다.

profile
게임프로그래머 지망생

0개의 댓글