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


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

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

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

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

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

  • 2016년 08월 29일에 작성됨

조회수 118


1 답변


좋아요
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++은 부모)
  • 2016년 08월 30일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

  • 깔끔한답변 감사합니다~!    JerryWj   2016.8.30 09:05     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close