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

2024. 11. 6. 15:42·공부/C++
728x90

상속이란?

"UnivStudent 클래스가 Person 클래스를 상속한다"

UnivStudent 클래스가 Person클래스를 상속하게 되면,

UnivStudent 클래스는 Person클래스가 지니고 있는 모든 멤버를 물려받는다.

즉, UnivStudent 객체에는 UnivStudent 클래스에 선언되어있는 멤버뿐만 아니라 Person 클래스에 선언되어있는 멤버도 존재하게 된다.

 

상속 관련 예제

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

class Person {
private:
	int age;
	char name[50];
public:
	Person(int myage, const 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(const char* myname, int myage, const char* mymajor) 
		: Person(myage, myname) 
	{
		strcpy(major, mymajor);
	}
	void WhoAreYou() const {
		WhatYourName();
		HowOldAreYou();
		//Person클래스를 상속했기 때문에 Person클래스의 멤버 함수를 호출할 수 있다.
		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;
}

  • UnivStudent 클래스의 생성자는 Person 클래스의 멤버까지 초기화해야한다.
  • UnivStudent 클래스의 생성자는 Person 클래스의 생성자를 호출해서 Person 클래스의 멤버를 초기화하는 것이 좋다.

위의 예제 코드에서 

UnivStudent(const char* myname, int myage, const char* mymajor) 
	: Person(myage, myname) 
{
	strcpy(major, mymajor);
}

이니셜라이저 부분의 의미는 Person 클래스의 생성자를 호출하여 myage와 myname에 저장된 값을 전달하는 것이다.

 

그럼 UnivStudent클래스의 멤버함수(또는 생성자) 내에서는 Person클래스에 private로 선언된 멤버변수에 접근이 가능할까?

=> 직접 접근이 불가능하기 때문에 Person 클래스에 정의된 public 함수를 통해서 간접적으로 접근해야 한다.

'정보의 은닉'은 하나의 객체 내에서도 진행이 된다.

 

용어 정리

Person UnivStudent
상위 클래스 하위 클래스
기초(base) 클래스 유도(derived) 클래스
슈퍼(super) 클래스 서브(sub) 클래스
부모 클래스 자식 클래스

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

#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();
	cout << "---------------------" << endl;
}

  • 유도 클래스의 객체 생성 과정에서 기초 클래스의 생성자는 항상 호출된다.
  • 유도 클래스의 생성자에서 기초 클래스의 생성자 호출을 명시하지 않으면, 기초 클래스의 void 생성자가 호출된다.

유도 클래스의 객체 생성 과정에서는 기초 클래스의 생성자와 유도 클래스의 생성자가 모두 호출된다.

클래스의 멤버는 해당 클래스의 생성자를 통해서 초기화해야 한다는 기본 원칙이 적용되기 때문이다.


유도 클래스 객체의 소멸과정

#include <iostream>
using namespace std;

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

class SoDerived : public SoBase {
private:
	int derivNum;
public:
	SoDerived(int n) : SoBase(n), derivNum(n) {
		cout << "SoDerived() : " << derivNum << endl;
	}
	~SoDerived() {
		cout << "~SoDerived() : " << derivNum << endl;
	}
};
int main(void) {
	SoDerived drv1(15);
	SoDerived drv2(27);
	return 0;
}

위의 예제에서 알 수 있는 사실 :

  • 유도 클래스의 객체가 소멸될 때에는, 유도 클래스의 소멸자가 실행되고 난 뒤에 기초 클래스의 소멸자가 실행된다.
  • 스택에 생성된 객체의 소멸 순서는 생성순서와 반대이다.

유도 클래스 소멸자 -> 기초 클래스 소멸자

 

따라서 생성자에서 동적 할당한 메모리 공간은 소멸자에서 해제해야한다.

 

 

728x90

'공부 > C++' 카테고리의 다른 글

[C++] 7-4. 상속을 위한 조건  (0) 2024.11.08
[C++]7-3. protected 선언과 세가지 형태의 상속  (0) 2024.11.07
[C++] 7-1. 상속에 들어가기에 앞서  (0) 2024.11.06
[C++] 6-3. c++에서의 static  (2) 2024.11.01
[C++] 6-2. 클래스와 함수에 대한 friend 선언  (0) 2024.10.31
'공부/C++' 카테고리의 다른 글
  • [C++] 7-4. 상속을 위한 조건
  • [C++]7-3. protected 선언과 세가지 형태의 상속
  • [C++] 7-1. 상속에 들어가기에 앞서
  • [C++] 6-3. c++에서의 static
knhoo
knhoo
  • knhoo
    &*
    knhoo
  • 전체
    오늘
    어제
    • 전체 (139)
      • Unity 개발일지 (1)
        • [Unity2D]졸업프로젝트 (17)
        • [Unity3D]VR프로젝트 (2)
      • 공부 (115)
        • 부트캠프 (12)
        • C++ (39)
        • Unity & C# (8)
        • 데이터베이스 (2)
        • 컴퓨터비전 (0)
        • 컴퓨터구조 (0)
        • python (7)
        • BAEKJOON (36)
        • 개발 (2)
        • 자료구조 (9)
      • 일상 (2)
  • 블로그 메뉴

    • Github
    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 📖README
  • 인기 글

  • 태그

    앱테크
    unity2d
    야핏무브
    구간합
    자료구조
    패널파워
    til
    오블완
    C++
    c#
    unity
    Cpp
    티스토리챌린지
    Python
    머니워크
    캐시워크
    멋쟁이사자처럼후기
    백준
    백준 #python
    비트버니
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
knhoo
[C++] 7-2. 상속의 문법적인 이해
상단으로

티스토리툴바