C++ 상속

#include <iostream>
using std::cout;
class P  // 기본 클래스, 부모 클래스
{
    private:
        void a() { cout << "a\n"; }
        void b() { cout << "b\n"; }
    protected:
        void c() { cout << "c\n"; }
        void d() { cout << "d\n"; }
    public:
        void e() { cout << "e\n"; }
        void f() { cout << "f\n"; }
};
class C : public P{

};
int main() {
    P parent;
    C child;
    child.X
}
X에는 어떤것들이 들어갈 수 있나?

상속

객체 지향 프로그래밍에서 상속은 클래스를 다른 클래스(클래스 기반 상속)를 기반으로 하여 유사한 구현을 유지하는 메커니즘이다. 주로 상속을 받는 클래스는 서브, 파생, 자식클래스로 불리우고 상속을 주는 클래스는 수퍼, 기본, 부모클래스라고 한다.

사용 이유

  • 중복 감소
  • 개발시간 단축
  • 기존 코드 재사용
  • 경비절감 등등

사용법

"자식 클래스" : "상속 접근제어" "기본 클래스" {};

아레 표는 상속 접근제어에 따른 자식클래스 멤버의 변화다.

private protected public
private 상속 불가 상속 불가 상속 불가
protected private protected protected
public private protected public
  • 주로 public을 많이 사용한다.
  • private로 상속을 받으면 기본클래스 모든 멤버가 private가 된다.
  • protected는 상속 가능한 private다.
  • 이러한 이유로 보통 protected멤버와 public상속제어 조합을 주로 사용한다.

주의사항

  • 위 표에서 보이듯이 public을 사용해도 기본클래스의 private속성 멤버들은 상속되지 않는다.
  • private로 상속을 받을때 모든 멤버가 private가 된다는건, 자식클래스의 멤버들만 접근이 가능하다.
#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(){showX(); cout<<y<<endl;}
};
int main()
{
B bb;
bb.setX(1); //기본클래스의 멤버접근
bb.setY(2); //파생클래스의 멤버접근
bb.showX(); //기본클래스의 멤버접근
bb.showXY(); //파생클래스의 멤버접근
return 0;
}
예제

생성자와 소멸자

기본클래스와 자식클래스 모두 생성자와 소멸자를 가질 수 있으며, 호출 순서는 상속된 순서에 따른다.

  • 생성자는 부모부터 호출
  • 소멸자는 자식부터 호출

매개변수가 있는 생성자

기본 클래스의 생성자는 매개변수 없이는 실행되지 않으므로 자식 클래스가 객체를 만들때 기본 클래스의 매개변수를 전달해야한다

방법

"자식클래스의 생성자"("자식클래스의 매개변수"):"기본클래스의 생성자"("매개변수"){}

#include <iostream>
class Man {
    protected:
    std::string name;
    int age;
    public:
    Man(std::string name, int age){
        this->name = name;
        this->age = age;
    }
    void m_show() {
        std::cout << "이름:" << name << std::endl;
        std::cout << "나이:" << age << std::endl;
    }
};
class Student : public Man{
    std::string ban;
    std::string hak;
    public:
    Student(std::string name, int age, std::string ban, std::string hak) : Man(name, age){
        this->ban = ban;
        this->hak = hak;
    }
    void s_show() {
        m_show();
        std::cout << "반:" << ban << std::endl;
        std::cout << "학번:" << hak << std::endl;

    }
};

class Teacher : public Man{
    std::string major;
    std::string subject;
    public:
    Teacher(std::string name, int age, std::string major, std::string subject) : Man(name, age){
        this->major = major;
        this->subject = subject;
    }
    void t_show() {
        m_show();
        std::cout << "전공:" << major << std::endl;
        std::cout << "담당과목:" << subject << std::endl;

    }
};

int main()
{
    Student kks("김컴소", 20, "C반", "202012000");
    Teacher hsh("한미소", 40, "전산", "C++프로그래밍");
    kks.s_show();
    hsh.t_show();
    return 0;
}