ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] Dynamin Binding <Virtual Function, Virtual Destructor>
    공부/C++ 2020. 11. 6. 19:48

    상속개념을 도입하면서 유용하게 사용할 수 있는 동적바인딩!!

    우선 Binding(바인딩)이란?

    프로그램 구성 요소의 성격을 결정해주는 것

    예를 들면 변수의 데이터 타입을 결정하는 것이 있어요.

     

    그렇다면 동적 바인딩이란??

    Dynamic! 즉 실행시간에 구성요소의 성격이 결정되는 것

     

    C++ 에서 Dynamic Binding을 사용하려면???

    1. virtual

    부모 클래스의 멤버함수에 가상함수를 생성해요

    2. variable type, value type

    부모클래스 포인터 또는 레퍼런스 타입을 변수 타입으로!
    
    child클래스의 객체를 값으로!

    예시 코드를 보면서 이해해봐요😎

    class Person {
    public:
        virtual void talk() {cout << "안녕하세요. 사람입니다. 개굴" << endl;}
    };
    
    class Student : pubic Person {
    public:
        void talk() {cout << "안녕. 학생이야." << endl;}
    };
    
    class Gagul : pubic Person
    public:
        void talk() {cout << "개굴개구르르개골" << endl;}
    };
    
    class OtherPerson : pubic Person {
    };
    
    void main()
    {
        Person *aPerson[4];
        aPerson[0] = new Person();
        aPerson[1] = new Student();
        aPerson[2] = new Gagul();
        aPerson[3] = new OtherPerson();
    
        for(int i = 0; i < 4; i++) aPerson[i]->talk();
        return 0;
    }

    출력

    with virtual without virtual
    안녕하세요. 사람입니다. 개굴
    안녕. 학생이야.
    개굴개구르르개골
    안녕하세요. 사람입니다. 개굴
    안녕하세요. 사람입니다. 개굴
    안녕하세요. 사람입니다. 개굴
    안녕하세요. 사람입니다. 개굴
    안녕하세요. 사람입니다. 개굴

     

    가상함수를 정의했다면 소멸자도 가상함수로!!!!😉

    Person *student = new Student;
    student->talk();
    delete student();

    위의 delete에서 student는 Person의 포인터이므로 Person의 소멸자를 호출해요.

    하지만!! 실제로는 Student클래스의 객체이므로 Student의 소멸자를 호줄해야해요.

    그렇기 때문에 소멸자도 가상함수로 선언합니다!

    class Person
    {
    public:
        Person() {cout << "Constructor: Person" << endl;}
        virtual ~Person() {cout << "Destructor: Person" << endl;}
    };
    class Student : pubic Person
    {
    public:
        Student() {cout << "Constructor: Student" << endl;}        
        ~Student() {cout << "Destructor: Student" << endl;}
    };
    
    void main()
    {
        Person *gagul = new Student();
        delete gagul;
    }

    '공부 > C++' 카테고리의 다른 글

    [객체지향프로그래밍] 응집도(Cohesion)와 결합도(Coupling)  (0) 2020.11.03
    cin, scanf 속도비교  (0) 2020.08.11
    Pair  (0) 2020.07.26
    std::string  (0) 2020.07.26
    namespace  (2) 2020.07.26
Designed by Tistory.