상속 (1)

Yama·2024년 1월 11일
0

어소트락 수업

목록 보기
41/55

상속

class A
{
private:
	int m_A;
};

class B : public A
	// : public A
{
private:
	int m_B;
};

class C : public B
{
private:
	int m_C;
};
  • B 클래스는 A 클래스를 상속 받았다.
    • B 클래스는 A 클래스로부터 파생되었다.
  • C 클래스는 B 클래스를 상속 받았다.
    • C 클래스는 B 클래스로부터 파생되었다.
int main()
{	
	// 1
	A a;
    // 2
	B b;
    // 3
	C c;	

	return 0;
}
  • 1번의 크기는 4바이트이다.
  • 2번의 크기는 8바이트이다.
    • A클래스를 상속받아서 4 + 4
    • A클래스파트|B클래스파트| 로 파트가 나뉜다.
  • 3번의 크기는 12바이트이다.
    • B클래스를 상속받아서 A도 자연스럽게 상속됨 4 + 4 + 4
    • A클래스파트|B클래스파트|C클래스파트| 로 파트가 나뉜다.
class A
{
private:
	int m_A;

public:
	// 1
	void SetA(int _a)
	{
		m_A = _a;
	}
};

class B : public A
{
private:
	int m_B;


public:
	// 2
	void SetB(int _b)
	{
		m_B = _b;
	}

	int GetB()
	{
		return m_B;
	}
};

class C : public B
{
private:
	int m_C;
public:
	// 3
	void SetC(int _c)
	{
		m_A = _c;
		m_B = _c;
		this->m_C = _c;
	}
};
	a.SetA(10); 
	b.SetA(20); 
	c.SetA(30);
    
    b.SetB(10);
	c.SetB(1000);

	c.SetC(10);
  • 1번에 SetA를 만들어 두면 m_a에는 클래스 B,C둘다 접근이 가능하다.
  • 2번은 클래스 B하고 C에서 접근 가능
  • 3번은 C에서만 접근 가능
  • 부모의 구현되어있는 기능을 물려받는다.
    • 기능을 왜 물려줌.?
      • 추가적인 구현을 더할려공.
      • 기존몬스터의 기능을 상속을 받아서 대쉬 기능을 추가해서 기존의 것을 가지고 + 알파만 하면 편하다.
      • 코드의 재사용성이 올라감

접근 제한자 protected

class A
{
protected:
	int m_A;

public:
	void SetA(int _a)
	{
		m_A = _a;
	}
};

class B : public A
{
// 1
// private:
protected:
	int m_B;

public:
	void SetB(int _b)
	{
		m_B = _b;
	}

	int GetB()
	{
		return m_B;
	}
};

class C : public B
{
	int m_C;
public:
	void SetC(int _c)
	{
		m_A = _c;
		m_B = _c;
		m_C = _c;
	}
};
  • 1번처럼 protected대신 private을 적어두면 B클래스를 상속받은 C클래스도 m_B에 접근을 못한다.
  • private
    • 상속을 해줘도 외부 공개하기 싫을떄
  • protected
    • 파생 클래스(자식 클래스)에는 접근 허용
  • 보안을 철저히 해두면 복잡한 규모의 프로그래밍에서는 쉽게 문제를 잘 거를수 있어서 강사님은 protected를 잘 안쓰산다.
    • 맴버를 다 공개하고 상속을 시켜버리면 나중에 코드가 커지면 상속관계가 복잡해지고 막 자식 클래스에서 부모의 맴버를 수정하게하면 값을 어느 순간에 어디서 바꾼지 찾기 힘들어서 빡세다.
      • 디버깅할떄 힘들다.
    • 변수하나 만들떄마다 get,set함수 다 만들어주면 귀찮지만 나중에 디버깅할떄 중단점 걸어버리면 바로 바로 찾을수 있다.(보안을 철저히 해두면)

강의 코드

main.cpp

#include <iostream>


class A
{
protected:
	int m_A;

public:
	void SetA(int _a)
	{
		m_A = _a;
	}
};

class B : public A
{
protected:
	int m_B;

public:
	void SetB(int _b)
	{
		m_B = _b;
	}

	int GetB()
	{
		return m_B;
	}
};

// C 클래스는 B 클래스를 상속받았다.
class C : public B
{
private:
	int m_C;

public:
	void SetC(int _c)
	{
		m_A = _c;
		m_B = _c;
		m_C = _c;
	}
};

int main()
{
	A a; 
	B b; 
	C c;
    
	a.SetA(10);
	b.SetA(20);
	c.SetA(30);

	b.SetB(10);
	c.SetB(10);

	c.SetC(10);

	return 0;
}

1차 24.01.11
2차 24.01.12
3차 24.01.15
4차 24.01.16
5차 24.01.17

0개의 댓글