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++은 부모)
댓글 입력