본문 바로가기
-----ETC-----/C++ 성능 최적화 및 고급 테크닉 시리즈

[C++ 성능 최적화 및 고급 테크닉] Day 13: 고급 상속 및 다형성 기법

by cogito21_cpp 2024. 8. 1.
반응형

상속과 다형성의 중요성

상속과 다형성은 객체 지향 프로그래밍의 핵심 개념입니다. 이를 통해 코드 재사용성을 높이고, 유연하고 확장 가능한 소프트웨어를 개발할 수 있습니다. 고급 상속 및 다형성 기법을 사용하면 더 효과적으로 객체 간의 관계를 정의하고, 유지보수가 용이한 코드를 작성할 수 있습니다.

기본 상속과 다형성

기본적인 상속과 다형성은 다음과 같이 정의할 수 있습니다:

#include <iostream>

class Base {
public:
    virtual void show() {
        std::cout << "Base class" << std::endl;
    }
};

class Derived : public Base {
public:
    void show() override {
        std::cout << "Derived class" << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();
    basePtr->show(); // Derived class
    delete basePtr;
    return 0;
}

 

위 코드에서 Base 클래스는 show 함수를 가상 함수로 선언하고, Derived 클래스는 show 함수를 재정의합니다. 이를 통해 런타임 다형성을 구현할 수 있습니다.

 

고급 상속 기법

1. 다중 상속

다중 상속은 하나의 클래스가 둘 이상의 클래스를 상속받는 기법입니다. 다중 상속은 복잡성을 증가시키고, 다이아몬드 상속 문제를 일으킬 수 있습니다.

#include <iostream>

class A {
public:
    void show() {
        std::cout << "Class A" << std::endl;
    }
};

class B {
public:
    void show() {
        std::cout << "Class B" << std::endl;
    }
};

class C : public A, public B {
public:
    void show() {
        A::show();
        B::show();
    }
};

int main() {
    C obj;
    obj.show();
    return 0;
}

 

2. 가상 상속

가상 상속은 다이아몬드 상속 문제를 해결하기 위한 기법입니다. 이를 통해 다중 상속에서 공통 기초 클래스가 하나의 인스턴스만 생성되도록 합니다.

#include <iostream>

class A {
public:
    void show() {
        std::cout << "Class A" << std::endl;
    }
};

class B : virtual public A {};
class C : virtual public A {};

class D : public B, public C {};

int main() {
    D obj;
    obj.show();
    return 0;
}

 

고급 다형성 기법

1. 순수 가상 함수와 추상 클래스

순수 가상 함수는 서브 클래스에서 반드시 재정의해야 하는 함수입니다. 추상 클래스는 하나 이상의 순수 가상 함수를 가진 클래스입니다.

#include <iostream>

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

class Derived : public Base {
public:
    void show() override {
        std::cout << "Derived class" << std::endl;
    }
};

int main() {
    Derived d;
    d.show();
    return 0;
}

 

2. 다형성 캐스팅

다형성 캐스팅은 dynamic_cast를 사용하여 런타임에 타입 안전한 캐스팅을 수행하는 기법입니다.

#include <iostream>

class Base {
public:
    virtual void show() {
        std::cout << "Base class" << std::endl;
    }
};

class Derived : public Base {
public:
    void show() override {
        std::cout << "Derived class" << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();
    Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
    if (derivedPtr) {
        derivedPtr->show(); // Derived class
    }
    delete basePtr;
    return 0;
}

 

실습 문제

문제 1: 가상 상속과 다형성 기법 사용하기

다음 코드에서 가상 상속을 사용하여 다이아몬드 상속 문제를 해결하고, 순수 가상 함수를 사용하여 다형성을 구현하세요.

 

main.cpp

#include <iostream>

class A {
public:
    void show() {
        std::cout << "Class A" << std::endl;
    }
};

class B : public A {};
class C : public A {};

class D : public B, public C {
public:
    void show() override {
        std::cout << "Class D" << std::endl;
    }
};

int main() {
    D obj;
    obj.show();
    return 0;
}

 

해답:

main.cpp (가상 상속 및 순수 가상 함수 적용)

#include <iostream>

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

class B : virtual public A {};
class C : virtual public A {};

class D : public B, public C {
public:
    void show() override {
        std::cout << "Class D" << std::endl;
    }
};

int main() {
    D obj;
    obj.show();
    return 0;
}

 

이제 열세 번째 날의 학습을 마쳤습니다. 고급 상속 및 다형성 기법을 이해하고, 이를 구현하는 방법을 학습했습니다.

질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "CRTP(Curiously Recurring Template Pattern) 사용법"에 대해 학습하겠습니다.

반응형