1. 용어

  • 기본 클래스(base class): 상속해주는 클래스 > 부모 클래스
  • 파생 클래스(derived class): 상속받는 클래스 > 자식 클래스
  • 업 캐스팅(up-casting): 파생 클래스 포인터가 기본 클래스 포인터에 치환되는 것
  • 다운 캐스팅(down-casting): 기본 클래스의 포인터가 파생 클래스의 포인터에 치환되는 것
    ※ 업 캐스팅/다운 캐스팅이 이해가 되지 않는다면 포인터의 개념을 먼저 익히기

 

2. 클래스 상속

  • 기본 클래스의  속성과 기능을 파생 클래스에 물려주는 것
  • 중복된 기능을 기본 클래스로 작성, 보다 자세한 기능은 파생 클래스로 작성

예시)

Person Student Worker Programmer
잠자기
먹기


잠자기
먹기
공부하기

잠자기
먹기
일하기

잠자기
먹기
일하기
코딩하기

2-1. 상속 선언 방법

class Student : public Person
/* 
파생 클래스명: Student
상속 접근 지정: private, protected, public
기본 클래스명: Person
*/

 

2-2. 상속 지정

: 상속 선언 시private, protected,  public 3가지 중 하나 지정

  • private : 기본 클래스의 protected, public 멤버 속성을 private으로 계승
  • protected: 기본 클래스의 protected, public 멤버 속성을 protected로 계승
  • public: 기본 클래스의 protected, public 멤버 속성을 그대로 계승

 

 

3. 실습 문제

Q: 제시된 Circle 클래스 바탕으로 다음 코드가 실행되도록 Circle 클래스를 상속받는 NamedCircle 클래스를 작성하라.

class Circle {
	int radius;
public:
	Circle(int radius = 0) { this->radius = radius; }
	int getRadius() { return radius; }
	void setRadius(int radius) {this->radius = radius; }
	double getArea() { return 3.14 * radius * radius; }
};
NamedCircle waffle(3, "waffle");
waffle.show();

// 출력 >>> 반지름이 3인 waffle

A:

(내가 작성한 코드)

다른 작성 방법과 이해 안되는 부분을 주석으로 달아놨다.
해당 질문에 대한 답은 몇주 뒤 나에게 맡긴다.

더 공부하다 돌아오면 해답을 찾을 때가 있다

#include <iostream>
using namespace std;

class Circle {
	int radius;
public:
	Circle(int radius = 0) { this->radius = radius; }
	int getRadius() { return radius; }
	void setRadius(int radius) {this->radius = radius; }
	double getArea() { return 3.14 * radius * radius; }
};

class NamedCircle : public Circle {
	string name;
public:
	NamedCircle(int radius, string name); // 인라인으로 작성하는 방법 알고 싶음...
	void show();
};
// 정확히 이해 안됨, NamedCircle의 radius 값을 Circle의 radius의 값으로 넘겨주는 것으로 이해함
NamedCircle::NamedCircle(int radius, string name) : Circle(radius) {
	this->name = name;
}

void NamedCircle::show() {
	cout << name << ": 반지름이 " << getRadius() << "인 원" << endl;
}


int main() {
	NamedCircle Waffle(3, "waffle");
    waffle.show();
}

인라인으로 작성하는 방법 확인

class NamedCircle {
	string name;
public:
	NamedCircle( int radius, string name) : Circle (radius) {
    	this->name = name;
    }
}

근데... class 상속을 받았는데 멤버 함수도 상속을 받아야 하는 거시야...? ㅇㅅㅇ

'💻 프로그래밍 > C++' 카테고리의 다른 글

[C++] 오버라이딩  (0) 2022.07.23