본문 바로가기
-----ETC-----/C++ 마스터 시리즈

[C++ 마스터] Day 16: 가상 함수와 추상 클래스

by cogito21_cpp 2024. 8. 1.
반응형

가상 함수 (Virtual Function)

가상 함수는 기본 클래스에서 선언되고 파생 클래스에서 재정의될 수 있는 함수입니다. 가상 함수는 다형성을 구현하는 데 사용됩니다.

 

1. 가상 함수 선언

가상 함수는 기본 클래스에서 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;
}

 

추상 클래스 (Abstract Class)

추상 클래스는 하나 이상의 순수 가상 함수를 포함하는 클래스입니다. 추상 클래스는 직접 인스턴스화할 수 없으며, 이를 상속받는 파생 클래스에서 순수 가상 함수를 반드시 재정의해야 합니다.

 

1. 순수 가상 함수

순수 가상 함수는 = 0으로 정의된 가상 함수입니다.

class AbstractBase {
public:
    virtual void pureVirtualFunction() = 0;  // 순수 가상 함수
};

class Derived : public AbstractBase {
public:
    void pureVirtualFunction() override {
        cout << "Derived class implementation of pure virtual function" << endl;
    }
};

int main() {
    // AbstractBase obj;  // 오류: 추상 클래스는 인스턴스화할 수 없음
    Derived obj;
    obj.pureVirtualFunction(); // Derived class implementation of pure virtual function
    return 0;
}

 

예제 문제

문제 1: 동물 클래스와 이를 상속받는 고양이와 개 클래스 작성 (추상 클래스 사용)

동물 클래스를 작성하고, 이를 상속받는 고양이와 개 클래스를 작성하세요. 동물 클래스는 추상 클래스여야 하며, 각 클래스는 동물이 소리를 내는 순수 가상 함수를 재정의해야 합니다.

 

해설:

#include <iostream>

using namespace std;

class Animal {
public:
    virtual void makeSound() = 0;  // 순수 가상 함수
};

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;
}

 

이 프로그램은 차량 클래스를 추상 클래스로 만들고, 이를 상속받는 자전거와 자동차 클래스에서 순수 가상 함수를 재정의합니다.

 

다음 단계

16일차의 목표는 C++의 가상 함수와 추상 클래스에 대해 학습하는 것이었습니다. 다음 날부터는 템플릿 기초에 대해 다룰 것입니다.

 

내일은 "템플릿 기초"에 대해 다룰 예정입니다. 질문이나 피드백이 있으면 댓글로 남겨 주세요!

반응형