C++ 상속 (Inheritance) 정리
1. 기본 개념
상속이란 기존 클래스를 기반으로 새로운 클래스를 만드는 객체지향 개념입니다.
공통된 속성과 동작을 코드 재사용을 통해 자식 클래스에서 활용할 수 있게 해줍니다.
class 부모클래스 {
public:
void 공통기능() {
std::cout << "모든 자식에게 공통!" << std::endl;
}
};
class 자식클래스 : public 부모클래스 {
public:
void 고유기능() {
std::cout << "자식 고유 기능" << std::endl;
}
};
C++
복사
2. 상속 키워드 종류
종류 | 의미 |
public | 부모 클래스의 public/protected 멤버 → 그대로 유지 |
protected | 부모의 public → protected로 |
private | 부모의 모든 public/protected → private로 |
보통은 **public 상속**을 사용합니다.
3. 단일 상속 예제
#include <iostream>
using namespace std;
class Animal {
public:
void Eat() {
cout << "먹는다" << endl;
}
};
class Dog : public Animal {
public:
void Bark() {
cout << "멍멍!" << endl;
}
};
int main() {
Dog d;
d.Eat(); // Animal의 함수 호출
d.Bark(); // Dog 고유 함수 호출
}
C++
복사
Dog는 Animal을 상속받아서 Eat()을 사용할 수 있습니다.
4. 상속받은 함수 호출 (이름이 같을떄)
class Animal {
public:
void Speak() {
std::cout << "???";
}
};
class Cat : public Animal {
public:
void Speak() {
std::cout << "야옹!";
}
};
C++
복사
이 경우 함수 이름은 같지만 동작은 다릅니다.
5. virtual 함수와 다형성 (Polymorphism)
class Animal {
public:
virtual void Speak() {
std::cout << "Animal Sound" << std::endl;
}
};
class Dog : public Animal {
public:
void Speak() override {
std::cout << "멍멍!" << std::endl;
}
};
void MakeAnimalSpeak(Animal& a) {
a.Speak(); // virtual이 없으면 Animal 버전만 실행됨
}
int main() {
Dog d;
MakeAnimalSpeak(d); // "멍멍!"
}
C++
복사
이걸 동적 바인딩 또는 런타임 다형성이라고 합니다.
6. 순수 가상 함수 (Abstract Class)
class Shape {
public:
virtual double Area() const = 0; // 순수 가상 함수
};
class Circle : public Shape {
double radius;
public:
Circle(double r) : radius(r) {}
double Area() const override {
return 3.14 * radius * radius;
}
};
C++
복사
이걸 포함한 클래스는 추상 클래스가 되며, 객체를 직접 생성할 수 없습니다.
7. 상속 관련 주의사항
•
소멸자는 반드시 virtual ~Base()로 선언하여 자식 객체 소멸 보장
•
생성자/소멸자는 상속되지 않음 → 자식에서 명시 호출 필요 가능
•
private 멤버는 자식에서 접근 불가 (접근은 protected or public만)
핵심 요약
개념 | 요약 |
public 상속 | 일반적으로 사용, 부모 멤버 그대로 유지 |
virtual 함수 | 다형성(오버라이딩)을 가능하게 함 |
= 0 | 순수 가상 함수 → 추상 클래스가 됨 |
virtual ~Base() | 메모리 해제시 자식까지 소멸시키기 위해 필요 |
필요하시다면 이 내용을 PDF 또는 수업자료용 슬라이드로 정리해드릴 수 있습니다.
또는 방금 만든 20문제 중 하나를 골라서 위 개념을 바탕으로 완성 예제로도 제공 가능해요.
원하시는 방식이 있으신가요?
C++ 상속 연습문제 20선 (동적할당 X)
문제 1. 동물 소리 출력
int main() {
Dog d("Baekgu");
Cat c("Nabi");
d.Speak(); // Baekgu barks!
c.Speak(); // Nabi meows!
}
C++
복사
요구사항:
•
Animal 클래스를 기반으로 Dog, Cat 클래스를 상속합니다.
•
이름을 멤버로 가지고, Speak() 함수는 각 동물에 맞게 다형적으로 동작해야 합니다.
문제 2. 도형 면적
int main() {
Circle c(3.0);
Rectangle r(4.0, 2.0);
std::cout << c.Area() << std::endl; // 28.26
std::cout << r.Area() << std::endl; // 8.00
}
C++
복사
요구사항:
•
Shape 클래스를 기반으로 Circle, Rectangle 클래스를 구현하세요.
•
Area() 함수를 통해 면적을 반환합니다. 소수점 둘째 자리까지 출력하세요.
문제 3. 직원 급여 계산
int main() {
Manager m("Kim", 5000);
Developer d("Lee", 3000);
m.ShowSalary(); // Kim: 7500
d.ShowSalary(); // Lee: 3300
}
C++
복사
요구사항:
•
Employee 클래스를 기반으로 Manager, Developer를 상속합니다.
•
급여 계산 로직은 각각 다르게 적용되며, ShowSalary()로 출력합니다.
문제 4. 악기 연주
int main() {
Piano p;
Guitar g;
p.Play(); // Piano: ding ding!
g.Play(); // Guitar: strum strum!
}
C++
복사
요구사항:
•
Instrument 추상 클래스를 만들고, Play() 함수를 구현합니다.
•
Piano, Guitar는 각각 다르게 연주 소리를 출력합니다.
문제 5. 게임 캐릭터
int main() {
Knight k("Arthur");
Mage m("Merlin");
k.Attack(); // Arthur slashes with sword!
m.Attack(); // Merlin casts a spell!
}
C++
복사
요구사항:
•
Character 클래스를 상속받아 Knight, Mage를 구현합니다.
•
이름을 저장하고, 각 캐릭터의 Attack() 방식이 다르게 동작해야 합니다.
문제 6. 스마트기기 명령
int main() {
SmartLight light;
SmartSpeaker speaker;
light.Execute("turn on");
speaker.Execute("play music");
}
C++
복사
요구사항:
•
SmartDevice를 상속받아 각각 명령 처리하는 SmartLight, SmartSpeaker 클래스를 만드세요.
•
문자열 명령에 따라 동작이 다르게 출력되어야 합니다.
문제 7. 유닛 이동
int main() {
Warrior w("Thor");
Archer a("Robin");
w.Move(); // Thor charges forward
a.Move(); // Robin moves silently
}
C++
복사
요구사항:
•
Unit 클래스를 상속받아 Warrior, Archer를 만듭니다.
•
각각의 Move()는 이름과 함께 고유의 메시지를 출력합니다.
문제 8. 알림 시스템
int main() {
EmailNotification e("kim@example.com");
SMSNotification s("010-1234-5678");
e.Send();
s.Send();
}
C++
복사
요구사항:
•
Notification 추상 클래스를 만들고, Send() 함수를 구현합니다.
•
이메일, SMS 각각 다른 형식으로 전송 메시지를 출력합니다.
문제 9. 운동 기록
int main() {
Running run(30);
Cycling cycle(60);
run.PrintCalories(); // Running: 300 kcal
cycle.PrintCalories(); // Cycling: 500 kcal
}
C++
복사
요구사항:
•
Exercise 클래스를 기반으로 Running, Cycling을 상속합니다.
•
운동 시간에 따른 칼로리 계산 및 출력 기능을 구현하세요.
문제 10. 도서관 아이템
int main() {
Book b("C++ Guide");
DVD d("Inception");
b.PrintInfo();
d.PrintInfo();
}
C++
복사
요구사항:
•
LibraryItem 클래스를 기반으로 Book, DVD를 상속합니다.
•
각각 아이템 정보를 출력하는 PrintInfo()를 오버라이드 하세요.
문제 11. 교통수단
int main() {
Bus b;
Train t;
b.Move();
t.Move();
}
C++
복사
요구사항:
•
Vehicle 클래스를 상속하여 Bus, Train을 만드세요.
•
Move() 함수는 각 교통수단의 고유한 이동 방식 메시지를 출력합니다.
문제 12. 동물 병원
int main() {
Dog d("Bori");
Bird b("Chirpy");
d.Vaccinate();
b.Vaccinate();
}
C++
복사
요구사항:
•
Pet 클래스를 상속하여 Dog, Bird를 구현하세요.
•
이름과 종류에 맞는 백신 메시지를 출력하는 Vaccinate()를 만드세요.
문제 13. 전자기기 전원
int main() {
Laptop l("Lenovo");
Tablet t("iPad");
l.PowerOn();
t.PowerOn();
}
C++
복사
요구사항:
•
Device 클래스를 기반으로 Laptop, Tablet을 상속합니다.
•
각각 제품 이름과 함께 전원이 켜지는 메시지를 출력하세요.
문제 14. 결제 수단
int main() {
CreditCard c("Kim", "1234");
PayPal p("lee@mail.com");
c.Pay(10000);
p.Pay(5000);
}
C++
복사
요구사항:
•
PaymentMethod 추상 클래스를 만들고, CreditCard, PayPal을 구현하세요.
•
금액과 계좌 정보에 맞게 결제 메시지를 출력합니다.
문제 15. 학교 구성원
int main() {
Student s("Jisoo");
Teacher t("Minho");
s.Introduce();
t.Introduce();
}
C++
복사
요구사항:
•
Person 클래스를 상속받아 Student, Teacher를 만드세요.
•
Introduce() 함수는 각각 “I'm student ___”, “I'm teacher ___” 형식으로 출력합니다.
문제 16. 전투 피해량 계산
int main() {
Swordman s(100, 20);
Mage m(100, 30);
s.DealDamage(); // Swordman deals 20
m.DealDamage(); // Mage deals 30
}
C++
복사
요구사항:
•
Fighter 클래스를 상속받아 Swordman, Mage를 만드세요.
•
공격력만큼 피해를 주는 DealDamage() 함수를 구현하세요.
문제 17. 세금 계산기
int main() {
Employee e("Kim", 5000);
Freelancer f("Lee", 3000);
e.CalculateTax(); // 500
f.CalculateTax(); // 300
}
C++
복사
요구사항:
•
TaxPayer 클래스를 상속하여 Employee, Freelancer를 구현하세요.
•
각각 다른 세율로 세금을 계산하고 출력하세요.
문제 18. 주문 시스템
int main() {
Burger b(5000);
Pizza p(8000);
b.PrintPrice(); // 5000원입니다
p.PrintPrice(); // 8000원입니다
}
C++
복사
요구사항:
•
MenuItem 클래스를 상속받아 Burger, Pizza를 만들고,
•
각각 가격을 출력하는 PrintPrice() 함수를 작성하세요.
문제 19. 전시회 작품
int main() {
Painting p("Mona Lisa");
Sculpture s("David");
p.Display();
s.Display();
}
C++
복사
요구사항:
•
ArtWork 클래스를 상속하여 Painting, Sculpture를 만드세요.
•
이름과 유형에 맞는 메시지를 출력하는 Display()를 구현하세요.
문제 20. 운동 시뮬레이터
int main() {
Pushup p(20);
Squat s(30);
p.Show(); // Pushups: 20 reps
s.Show(); // Squats: 30 reps
}
C++
복사
요구사항:
•
Workout 클래스를 상속받아 Pushup, Squat을 구현합니다.
•
횟수를 저장하고, Show() 함수에서 형식에 맞게 출력하세요.
필요하다면 이 문제들을 기반으로:
•
PDF / DOCX 형태 문제지 제작
•
각 문제별 해설 또는 구현 예시 제공
•
난이도별 정렬 또는 교육용 수업 자료화
도 가능합니다. 원하시나요?