클래스의 속성 중 한개인 상속을 사용하기 위해서는 부모클래스와 자식클래스를 지정해줘야 한다. 자식클래스는 부모클래스의 멤버를 사용할 수 있지만 부모클래스에서는 접근이 불가능하다. 자식클래스에서 부모클래스의 멤버에 접근하기 위해서는 접근지정자 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;
}
};
이렇게 코딩을 해도 잘 작동한다.