C++ 참조형식 실형식의 개념과 java에서의 부모 자식 오버라이딩과의 비교

조회수 1317회

c++을 처음 공부중인데요! 어떤 두 클래스가 A는 부모 B는 자식 클래스일때, B에서 A의 함수를 오버라이딩한 함수 test가 있을때,

A ref = new B; ref.test();

를 하면 A함수의 test가 실행이 된다고 봤는데

자바에서는 오버라이딩하면 부모의 함수를 호출하였을때 오버라이딩한 자식의 함수가 실행이 된다고 배웠습니다.

혹시 제가 C++에서 이해한 저 내용이 맞는건가요??? 즉 C++에서 부모가 자식형식객체를 받았을때 부모의 함수를 실행하면 부모의 함수 내용이 실행이 되는건가요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • C++과 Java모두 오버라이딩하면 자식의 함수가 실행되는건 같지만, 형변환을 했을때의 동작이 다르네요.

    #include <iostream>
     
    using namespace std;
     
    class Animal {
    public:
        void eat() { cout << "동물이 먹는다." << endl; }
    };
     
    class Dog : public Animal {
    public:
        void eat() { cout << "개가먹는다" << endl; }
    };
     
    int main()
    {
        Dog dog;
        dog.eat();
        Animal& AnimalRef = dog;
        AnimalRef.eat();
        return 0;
    }
    

    이렇게 실행하면

    개가먹는다
    동물이 먹는다.
    

    와 같이 출력됩니다. 첫 줄은 Dog클래스가 Animal클래스의 eat을 override해서 '개가 먹는다'라고 출력되지만, 두번째 줄 출력과 같이 Dog 객체를 Animal로 형변환 하면 Animal의 eat함수가실행되네요.

    하지만 자바에서는 형변환이 일어나도 항상 객체 기준(자식클래스 기준)으로 함수가 실행됩니다.

    class CodeRunner{
        public static void main(String[] args){
            Dog dog = new Dog();
            dog.eat();
            Animal animal = dog;
            animal.eat();
    }
    }
    
    class Animal{ 
        public void eat(){System.out.println("동물이 먹는다.");}
    }
    
    class Dog extends Animal{
        public void eat(){System.out.println("개가 먹는다.");}
    }
    

    위 코드를 실행하면 '개가 먹는다'만 두 줄 출력됩니다.

    개가 먹는다.
    개가 먹는다.
    

    정리하면,

    • 오버라이딩하면 자식 클래스의 함수가 실행되는건 Java와 C++이 같다.
    • 형 변환 했을때는 호출되는 함수가 Java와 C++이 서로 다르다.(자바는 자식, C++은 부모)

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)