본문 바로가기

C++/C++ 문법

[C++] 상속 (Inheritance), protected

728x90
반응형

상속 (inheritance)

 

C++은 상속을 명시할 때 별도의 키워드가 존재하지 않는다.

 

키워드 대신 상속 지정자를 사용하여 어떤 클래스를 상속받는지 명시해 주면 된다.

 

상속과 관련된 내용은 앞서 포스팅한적이 있기 때문에 이번에는 사용방법만 설명하겠다.

 

상속 관련 내용

https://enchupin.tistory.com/127

 

 

class TestClass {
public:
	int age;
	string name;
};

class Student : TestClass {
private:
	int std_num;
};

 

위 코드에서처럼 : 다음에 

소멸자는 자식클래스의 소멸자가 먼저 호출되고 그다음에 부모클래스의 소멸자가 호출된다.

 

Java와 마찬가지로 다단계 상속도 가능하며 오버라이딩도 같은 원리로 가능하다.

 

오버라이딩 관련 내용

https://enchupin.tistory.com/128

 

 

 

 

 

 

생성자

 

C++에서는 부모클래스의 생성자를 멤버 이니셜라이저를 통해 호출할 수 있다.

 

따라서 아래 코드처럼 작성하여 사용하는 것이 가능하다.

 

class TestClass {
public:
	int age;
	string name;
	TestClass(int age, string name) {
		this->age = age;
		this->name = name;
	}
};

class Student : TestClass {
private:
	int std_num;
public:
	Student(int age, string name, int std_num)
		: TestClass(age, name), std_num(std_num) { }
};

 

이때 위 코드처럼 부모클래스의 생성자를 호출하려면 당연히 매개변수가 있는 생성자를 부모클래스에 정의해주어야 한다.

 

물론 생성자를 호출하지 않고 아래 코드처럼 사용하는 것도 가능하지만 생성자가 두 번 호출될 가능성이 있기 때문에

권장되지는 않는다.

 

class Student : TestClass {
private:
	int std_num;
public:
	Student(int age, string name, int std_num)
	{
		this->age = age;
		this->name = name;
		this->std_num = std_num;
	}
};

 

 

 

 

 

 

 

접근 제한자

 

C++에서는 상속을 명시할 때 접근 제한자를 설정할 수 있다.

 

예를 들어 아래 코드처럼 작성하는 것이 가능하다.

 

class Student : public TestClass {
private:
	int std_num;
};

 

위 코드처럼 public 접근제한자를 명시해 주면 Student Class에서는 TestClass의 public 멤버에만 접근이 가능하다.

 

따라서 아래와 같은 코드는 불가능하게 된다.

 

class TestClass {
private:
	int age;
	string name;
};

class Student : public TestClass {
public:
	void PrintData() {
		cout << age << " " << name << endl;
	}
};

 

 

만약 접근제한자를 명시하지 않으면 디폴트 값으로 private으로 선언되기 때문에 private 멤버에도 접근이 가능하다.

 

 

 

 

 

 

protected

 

protected 접근제한자로 선언된 변수는 자식클래스에서 어떤 접근 제한자로 상속받던 상관없이 접근이 가능하다.

 

그러나 private와 마찬가지로 class 외부에서의 접근은 불가능하게 유지된다.

 

#include <iostream>
#include <string>
using namespace std;

class TestClass {
protected:
	int age;
	string name;
public:
	TestClass(int age, const string& name)
		: age(age), name(name) { }
};

class Student : public TestClass {
private:
	int std_num;
public:
	Student(int age, const string& name, int std_num)
		: TestClass(age, name), std_num(std_num) { }
	void PrintData() {
		cout << std_num << ", " << age << ", " << name << endl;
	}
};

int main() {
	Student std(20, "Enchupin", 20210000);
	std.PrintData();
	return 0;
}

 

따라서 위 코드는 가능하지만 아래 코드는 불가능하다.

 

int main() {
	Student std(20, "kim", 20210000);
	cout << std.age;
	return 0;
}

 

 

 

 

 

 

 

728x90
반응형