상속 : 기존 클래스(부모 클래스 또는 기초 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스 또는 파생 클래스)에서 재사용할 수 있게 해주는 기능
부모 클래스와 자식 클래스:
부모 클래스는 기본적인 속성과 메서드를 정의하는 클래스.
자식 클래스는 부모 클래스를 상속받아 부모 클래스의 속성과 메서드를 사용할 수 있으며, 추가적인 속성과 메서드를 정의할 수 있다.
class Animal { // 부모 클래스
public:
void eat() {
std::cout << "Eating..." << std::endl;
}
};
class Dog : public Animal { // 자식 클래스
public:
void bark() {
std::cout << "Barking..." << std::endl;
}
};
int main() {
Dog myDog;
myDog.eat(); // 부모 클래스의 메서드 호출
myDog.bark(); // 자식 클래스의 메서드 호출
return 0;
}
간단한 예시로 Animal이라는 부모 클래스와 이를 상속하는 Dog라는 자식 클래스를 생성하였을때, main에서 Dog 클래스 객체인 myDog를 생성하면 Animal에 있는 함수 eat()와 Dog에 있는 bark() 함수를 불러 사용할 수 있다. (반대의 경우로 부모 클래스 Animal의 객체를 생성후 bark()를 사용하면 오류가 난다. 자식 클래스의 메소드는 부모 클래스 갹체론 사용 불가) 이렇게 상속을 통해 코드의 재사용성을 높일 수 있다.
class student
{
public:
student();
~student();
virtual void print() = 0; // 가상함수
virtual void slogan() = 0;
}
위와 같이 student라는 클래스를 생성했을 때 virtual void라고 적힌 부분이 있다. virtual은 가상 함수 선언으로, '이 함수는 가상 함수다'라고 선언하는 것으로 이렇게 선언한 함수는 같은 이름의 함수가 자식 클래스에서 선언되었을 경우(=오버라이드됐을 경우) 기존에는 같은 이름의 함수가 다른 네임스페이스로 구분되었던 것이 오버라이드되는 함수로 기존 함수가 "대체"되는 것이다. (= 0 : 이 함수는 "순수 가상함수다"라는 것을 표현하는 내용)
이렇게 가상함수로 만들어두면 이후 다른 자식 클래스가 만들어지고 거기서 본 함수를 오버라이드하는 것으로 해당 인스턴스를 부모 클래스의 포인터로서 접근한다 해도 "직접 명시하지 않는 이상" 상속받은 자식 클래스 측의 함수가 호출되게 된다.
class SeoulUniStudent : public student
{
public:
void print();
virtual void slogan() override;
}
student를 상속받은 자식 클래스 SeoulUniStudent를 간단하게 생성했을 때, student가 가지고 있던 print()와 slogan()을 그대로 선언했다. 이런 식으로 부모 클래스의 함수를 자식 클래스에서 재선언하여 그 내용을 비꾸는 행위를 "함수 오버라이드(override)"라고 한다. (이때 virtual과 override는 없어도 작동은 문제없음. 코드의 가독성을 위해 작성한 것)
'C++' 카테고리의 다른 글
C++) 포인터와 배열 (0) | 2025.01.13 |
---|---|
C++) 암시적 멤버 함수 (0) | 2025.01.13 |
C++) 클래스(Class) (0) | 2025.01.08 |
C++) 동적 할당 (0) | 2025.01.06 |
C++) 포인터(Pointer) (0) | 2025.01.06 |