상속 (Inheritance)
상속은 기존 클래스(기본 클래스 또는 부모 클래스)를 기반으로 새로운 클래스(파생 클래스 또는 자식 클래스)를 정의하는 기능입니다. 상속을 사용하면 코드의 재사용성을 높이고, 클래스 간의 계층 구조를 만들 수 있습니다.
1. 기본 클래스와 파생 클래스
기본 클래스를 상속하여 파생 클래스를 정의할 수 있습니다.
class Base {
public:
void show() {
cout << "Base class show function" << endl;
}
};
class Derived : public Base {
public:
void display() {
cout << "Derived class display function" << endl;
}
};
int main() {
Derived obj;
obj.show(); // Base class show function
obj.display(); // Derived class display function
return 0;
}
2. 접근 지정자와 상속
파생 클래스는 기본 클래스의 접근 지정자에 따라 멤버에 접근할 수 있습니다. public
, protected
, private
상속이 있습니다.
class Base {
protected:
int protectedVar;
public:
int publicVar;
};
class Derived : public Base {
public:
void setValues(int p, int q) {
protectedVar = p; // 접근 가능
publicVar = q; // 접근 가능
}
void display() {
cout << "Protected Var: " << protectedVar << endl;
cout << "Public Var: " << publicVar << endl;
}
};
int main() {
Derived obj;
obj.setValues(10, 20);
obj.display();
return 0;
}
다형성 (Polymorphism)
다형성은 같은 인터페이스를 통해 다른 동작을 구현하는 능력입니다. C++에서는 주로 가상 함수와 함께 사용됩니다.
1. 가상 함수 (Virtual Function)
가상 함수는 파생 클래스에서 재정의될 수 있는 함수입니다. 기본 클래스에서 virtual
키워드를 사용하여 선언합니다.
class Base {
public:
virtual void show() {
cout << "Base class show function" << endl;
}
};
class Derived : public Base {
public:
void show() override {
cout << "Derived class show function" << endl;
}
};
int main() {
Base* basePtr;
Derived derivedObj;
basePtr = &derivedObj;
basePtr->show(); // Derived class show function
return 0;
}
2. 순수 가상 함수 (Pure Virtual Function)
순수 가상 함수는 파생 클래스에서 반드시 재정의해야 하는 가상 함수입니다. 순수 가상 함수가 하나 이상 포함된 클래스를 추상 클래스라고 합니다.
class Shape {
public:
virtual void draw() = 0; // 순수 가상 함수
};
class Circle : public Shape {
public:
void draw() override {
cout << "Drawing Circle" << endl;
}
};
class Square : public Shape {
public:
void draw() override {
cout << "Drawing Square" << endl;
}
};
int main() {
Shape* shape1 = new Circle();
Shape* shape2 = new Square();
shape1->draw(); // Drawing Circle
shape2->draw(); // Drawing Square
delete shape1;
delete shape2;
return 0;
}
예제 문제
문제 1: 동물 클래스와 이를 상속받는 고양이와 개 클래스 작성
동물 클래스를 작성하고, 이를 상속받는 고양이와 개 클래스를 작성하세요. 각 클래스는 동물이 소리를 내는 함수를 가지고 있어야 합니다.
해설:
#include <iostream>
#include <string>
using namespace std;
class Animal {
public:
virtual void makeSound() {
cout << "Some generic animal sound" << endl;
}
};
class Cat : public Animal {
public:
void makeSound() override {
cout << "Meow" << endl;
}
};
class Dog : public Animal {
public:
void makeSound() override {
cout << "Bark" << endl;
}
};
int main() {
Animal* animal1 = new Cat();
Animal* animal2 = new Dog();
animal1->makeSound(); // Meow
animal2->makeSound(); // Bark
delete animal1;
delete animal2;
return 0;
}
이 프로그램은 동물 클래스를 상속받아 고양이와 개 클래스를 작성하고, 각 클래스가 동물이 소리를 내는 함수를 구현합니다.
문제 2: 도형 클래스와 이를 상속받는 원과 사각형 클래스 작성
도형 클래스를 작성하고, 이를 상속받는 원과 사각형 클래스를 작성하세요. 각 클래스는 도형의 면적을 계산하는 함수를 가지고 있어야 합니다.
해설:
#include <iostream>
#include <cmath>
using namespace std;
class Shape {
public:
virtual double area() = 0; // 순수 가상 함수
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
double area() override {
return M_PI * radius * radius;
}
};
class Rectangle : public Shape {
private:
double width;
double height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
double area() override {
return width * height;
}
};
int main() {
Shape* shape1 = new Circle(5.0);
Shape* shape2 = new Rectangle(4.0, 6.0);
cout << "Circle area: " << shape1->area() << endl; // Circle area: 78.5398
cout << "Rectangle area: " << shape2->area() << endl; // Rectangle area: 24
delete shape1;
delete shape2;
return 0;
}
이 프로그램은 도형 클래스를 상속받아 원과 사각형 클래스를 작성하고, 각 클래스가 도형의 면적을 계산하는 함수를 구현합니다.
문제 3: 차량 클래스와 이를 상속받는 자전거와 자동차 클래스 작성
차량 클래스를 작성하고, 이를 상속받는 자전거와 자동차 클래스를 작성하세요. 각 클래스는 차량의 최고 속도를 반환하는 함수를 가지고 있어야 합니다.
해설:
#include <iostream>
using namespace std;
class Vehicle {
public:
virtual int topSpeed() = 0; // 순수 가상 함수
};
class Bicycle : public Vehicle {
public:
int topSpeed() override {
return 25; // 자전거의 최고 속도
}
};
class Car : public Vehicle {
public:
int topSpeed() override {
return 200; // 자동차의 최고 속도
}
};
int main() {
Vehicle* vehicle1 = new Bicycle();
Vehicle* vehicle2 = new Car();
cout << "Bicycle top speed: " << vehicle1->topSpeed() << " km/h" << endl; // Bicycle top speed: 25 km/h
cout << "Car top speed: " << vehicle2->topSpeed() << " km/h" << endl; // Car top speed: 200 km/h
delete vehicle1;
delete vehicle2;
return 0;
}
이 프로그램은 차량 클래스를 상속받아 자전거와 자동차 클래스를 작성하고, 각 클래스가 차량의 최고 속도를 반환하는 함수를 구현합니다.
다음 단계
15일차의 목표는 C++의 상속과 다형성에 대해 학습하는 것이었습니다. 다음 날부터는 가상 함수와 추상 클래스에 대해 더 깊이 있게 다룰 것입니다.
내일은 "가상 함수와 추상 클래스"에 대해 다룰 예정입니다. 질문이나 피드백이 있으면 댓글로 남겨 주세요!
'-----ETC----- > C++ 마스터 시리즈' 카테고리의 다른 글
[C++ 마스터] Day 16: 가상 함수와 추상 클래스 (0) | 2024.08.01 |
---|---|
[C++ 마스터] Day 17: 템플릿 기초 (0) | 2024.08.01 |
[C++ 마스터] Day 13: 생성자와 소멸자 (0) | 2024.08.01 |
[C++ 마스터] Day 14: 연산자 오버로딩 (0) | 2024.08.01 |
[C++ 마스터] Day 11: 구조체와 열거형 (0) | 2024.08.01 |