[C++] 상속

dd_ddong·2022년 7월 26일
0

c++

목록 보기
24/38

상속


class Sub : public Base
{
}

Sub : 상속받는 class
Base : 상속한 class

보통 Sub는 유도클래스 base는 기초클래스라고 한다.

유도클래스는 기초클래스의 멤버 + 자기자신의 멤버 로 구성된다.

생성자

유도클래스는 기초생성자의 멤버들도 초기화 할 의무가 있다.

"클래스의 멤버는 해당 클래스의 생성자를 통해 초기화해야 한다."

하지만 위와 같은 규칙을 지켜야 하기 때문에 유도클래스의 생성자에서 기초클래스의 생성자를 호출하는 방법을 사용한다.


class SoBase {
private:
	int baseNum;
public:
	SoBase() : baseNum(20)
	{

	}
	SoBase(int n) :baseNum(n)
	{

	}
	void ShowBaseData()
	{
		cout << baseNum << endl;
	}
};

class SoDerived : public SoBase
{
private:
	int derivNum;
public:
	SoDerived() : derivNum(20) // SoBase(void)도 호출
	{

	}
	SoDerived(int n) : derivNum(n) // SoBase(void)도 호출
	{

	}
	SoDerived(int n1, int n2) : SoBase(n1), derivNum(n2)
	{

	}
};

생성자 규칙

유도클래스의 객체생성 과정에서 기초클래스의 생성자는 무조건 호출된다.
유도클래스의 생성자에서 기초클래스 생성자 호출을 명시하지 않으면 void형 생성자가 호출된다.
유도클래스의 생상자 호출 중 기초클래스의 호출이 이뤄진다.

SoDerived temp;
-> SoDrived(), SoBase() 호출
derivNum = 20, baseNum = 20 으로 초기화

SoDerived temp(1);
-> SoDrived(int n), SoBase() 호출
derivNum = 1, baseNum = 20 으로 초기화

SoDerived temp(1, 2);
-> SoDrived(int n), SoBase(int n) 호출
derivNum = 1, baseNum = 2 으로 초기화

객체생성과정

  1. 메모리에 할당
  2. 유도클래스의 생성자 호출
  3. 기초클래스의 생성자 호출

소멸자

유도클래스의 객체 소멸시

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

기초클래스의 소멸자도 호출되기 때문에 기초클래스 생성자에서 동적할당한 메모리는 기초클래스 소멸자에서 해제한다.

문제 7-1 (2)

class MyFriendInfo
{
private:
	char* name;
	int age;
public:
	MyFriendInfo(const char* name, int age) : age(age)
	{
		int len = strlen(name) + 1;
		this->name = new char[len];
		strcpy_s(this->name, len, name);
	}
	~MyFriendInfo()
	{
		delete[]name;
	}
};

class MyFriendDetailInfo : public MyFriendInfo
{
private:
	char* addr;
public:
	MyFriendDetailInfo(const char* name, int age, const char* addr) :MyFriendInfo(name, age)
	{
		int len = strlen(addr) + 1;
		this->addr = new char[len];
		strcpy_s(this->addr, len, addr);

	}
	~MyFriendDetailInfo()
	{
		delete[]addr;
	}
};

    

0개의 댓글