2014-10-16 4 views
5

이 자바 코드 조각이 C++의 동일한 코드와 다른 출력을 왜 생성하는지 궁금합니다.이 두 코드의 차이점은 무엇입니까?

A::Foo() 
B::Foo() 

자바 코드는 다음과 같습니다 :

#include "stdafx.h" 
#include <iostream> 
using namespace std; 

class A 
{ 
public: 
    A(){ 
     this->Foo(); 
    } 
    virtual void Foo() 
    { 
     cout << "A::Foo()" << endl; 
    } 
}; 
class B : public A 
{ 
public: 
    B() 
    { 
     this->Foo(); 
    } 
    virtual void Foo() 
    { 
     cout << "B::Foo()" << endl; 
    } 
}; 
int main(int, char**) 
{ 
    B objB; 
    system("pause"); 
    return 0; 
} 

출력 생산

public class Testa { 
    public Testa() 
    { 
     this.Foo(); 
    } 
    public static void main(String[] args) 
    { 
     Testb b = new Testb(); 
    } 
    void Foo() 
    { 
     System.out.println("A"); 
    } 

} 
class Testb extends Testa { 
    public Testb() 
    { 
     this.Foo(); 
    } 
    @Override 
    void Foo() 
    { 
     System.out.println("B"); 
    } 
} 

이 코드는 생산 만

B 
B 

왜이 경우 다른이 출력 ? 자바 Testa 생성자가 포함되기 전에

+1

C++에서는 생성자 (또는 소멸자)에서 가상 함수를 호출하면 안됩니다. Java를 많이 사용하지 않으므로 이에 대해 설명하지 않겠습니다. – Borgleader

+2

C++ 코드에서는 두 생성자 모두에서 foo를 호출하지만 Java 코드에서는 Testb의 생성자에서만 호출한다는 점에 유의하십시오. – Eran

+0

죄송합니다. 잘못 입력하셨습니다. –

답변

5

차이점은 건설 중 다형성 처리에 있습니다. Java에서 객체의 동적 유형은 파생 클래스의 동적 유형이므로 즉시 생성자가 멤버 변수를 설정할 기회를 갖기 전에 멤버 함수를 호출 할 수 있습니다. 이것은 나쁘다.

C++에는 다른 접근 방식이 있습니다. 생성자가 실행되는 동안 생성자가 속한 클래스 중 하나 인 것으로 간주되는 개체 유형입니다. 멤버 함수에 대한 모든 호출은 해당 가정에 따라 정적으로 처리됩니다. 결과적으로 A의 생성자는 A::foo()을 호출하고 B의 생성자는 B::foo()을 호출합니다.

2

편집

내 대답의 첫 번째 부분이 주어졌다.


는 자바 코드에서, 당신은 당신의 C++ 코드로 정의 된 Testa 생성자가 없습니다. 따라서 하나의 B 만 Java로 인쇄됩니다.

그러나 당신이 한 경우에도 코드를 더 동등하게합니다 : 그것은 다형성이 방법은 생성자에서 호출 된 경우에도 작동하기 때문에 자바에서

B 
B 

를 인쇄 할

public Testa() 
{ 
    this.Foo(); 
} 

합니다. 그러나 Testb에서 메서드를 호출 할 때 개체 Testb의 자식 부분이 여전히 초기화되지 않기 때문에이 작업을 수행하는 것은 좋지 않습니다.

+0

좋아요, 당신은 내 마음을 읽었습니다.그래서 이것은 C++에서 이와 같이 작동하지 않습니까? –

+0

@MattJones 아니, 그렇지 않습니다. –

+1

@MattJones 저는 C++보다 Java를 더 많이 알고 있습니다. 왜 C++이 다르게 동작하는지 모르겠습니다. 그러나 C++에서'A :: Foo()'와'B :: Foo()'를 출력하는지 확인할 수 있습니다. – rgettman

관련 문제