ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] 다형성 특징
    C++ 2023. 1. 4. 17:32

    다형성은 매우 효율적인 도구란 것을 알았지만

    부모클래스의 포인터로 자식클래스를 참조할 수 있게 만들었지만!

    이에 따른 단점이 존재함 ㅇㅇ

    아래 두가지 꼭 명심 ㄱㄱ

     


    [중요 1]

     

    바로 해당 포인터클래스에 있는 변수와 함수까지만 호출할 수 있다는 것

    AAA BBB CCC 클래스가 있고 

    BBB : public AAA

    CCC : public BBB

    라고 하자

     

    CCC > BBB > AAA 인 셈이다.

     

    이때 AAA 포인터로 CCC 객체를 참조하면

    AAA 클래스에 해당하는 변수와 함수만 참조/호출할 수 있음

     

    CCC 객체의 변수와 함수는 참조할 수 없다!

     

    그럼 만약 BBB 포인터로 CCC객체를 참조하면?

    BBB 클래스 변수와 함수 + AAA 클래스 변수와 함수만 참조가능한 거임

     

    C++ 컴파일러가 포인터연산의 가능성 여부를 판단할때,

    포인터의 자료형을 기준으로 판단하지,

    실제 가리키는 객체의 자료형을 기준으로 판단하지 않기 때문!

     

    포인터형에 해당하는 클래스에 정의된 멤버에만 접근이 가능한 것임!!

     

    class AAA {
    public :
        void MyFunc() { cout << "AAA func" << endl; }
    };
    
    class BBB : public AAA {
    public:
        void MyFunc() { cout << "BBB func" << endl; }
    };
    
    class CCC : public BBB {
    public:
        void MyFunc() { cout << "CCC func" << endl; }
    };
    
    int main() {
        CCC* cptr = new CCC();
        BBB* bptr = cptr;
        AAA* aptr = bptr;
    
        cptr->MyFunc();
        bptr->MyFunc();
        aptr->MyFunc();
        return 0;
    }

    이렇게 하면 

     

    이렇게 출력된다. 이유는 잘 생각해보면 된다.

     


    [중요 2]

     

    범위가 더 큰놈 == 자식

    범위가 더 작은놈 == 부모

    라고 할때 

     

    무조건 다형성은 작은놈에서 큰놈으로"만" 된다!

    작은놈에서 큰놈"만" 참조가 가능하지,

    큰놈에서 작은놈을 참조할 순 없다!

     

    만약 이런 코드면 에러다

     

    CCC* cptr = new AAA();
    
    AAA* aptr = new CCC();
    BBB* bptr = aptr;

     

    #1번째꺼

     

    CCC 포인터로 AAA를 참조못한다. 

    CCC포인터는 선언할때

    자기가 CCC 객체나 CCC 클래스를 상속하는 클래스를 참조할거라고

    컴파일러가 미리 예측하는데

    엥? CCC 자기 함수도 호출못하는 AAA 클래스 객체가 나왔네? 에러다

     

    #2번째꺼

     

    BBB포인터에 AAA포인터형을 대입한다?

    BBB포인터로는 BBB와 CCC만 가능하다!

    큰놈이 작은놈을 참조할 순 없다 ㅇㅇ 

     


    [중요 3]

     

    이런 다형성은 포인터뿐만 아니라 참조자에도 적용된다! 

     

    AAA형 참조자는 AAA형 객체 또는 AAA를

    직접 혹은 간접적으로 상속하는 모든 객체를 참조할 수 있다!

     

    C++ 코드나 함수들을 보면 인자를 참조자로 받고

    참조자로 리턴하는 경우가 굉장히 많다.

    따라서 참조자에 다형성을 적용하는 경우에 익숙해져야함

    'C++' 카테고리의 다른 글

    [c++] 순수가상함수와 추상클래스  (0) 2023.01.06
    [c++] 가상함수(virtual functions)  (0) 2023.01.05
    [C++] 다형성(polymorphism)  (0) 2023.01.04
    [C++] 상속(2) - 간단한 예시  (1) 2022.12.31
    [C++] 상속(1) - 개념  (0) 2022.12.31