2013-06-07 3 views
0

다음 코드 샘플을 살펴보면 d.B::numb.num과 같았지만 같지 않다고 생각했습니다. 자체 주소가있는 다른 변수 인 것 같습니다. 실행 버튼을 클릭하면 b.num, d.numd.B::num의 세 변수가 각각 3, 4 및 5와 관련된 값을 갖습니다.범위 해석이 재정의 된 변수에서 작동하지 않는 이유는 무엇입니까?

왜 그렇습니까? 그리고 정확히 d.B::numb.num과 같지 않습니다.

B[int B::num] 

D[int B::num, int D::num] 

을 수 있습니다 당신이 B::num

+3

하지만 두 개의 별개의 개체 인 'b'와 'd'가 있습니다. 'd.B :: num'은'd' 인스턴스 안에있는'B :: num'의 인스턴스를 가리 킵니다. 'b.num'은 완전히 다른 인스턴스의 일부입니다. – jogojapan

+1

'd'와'b'는 서로 다른 객체이므로'dB :: num'과'bB :: num'은 분명히 다른 [sub] 객체가 될 것입니다 ('B :: num'은'static'이 아닙니다) . 네가 묻는 것을 내가 이해하고 있는지 모르겠다. –

+2

변수를 "무시"할 수 없습니다. – Asha

답변

1

d.B::num 기본값을 호출 할 경우 D::numd.num 기본값을 호출하는 경우 :

struct B {int num;}; 

struct D : public B {int num;}; 

int main() { 

    B b; 
    D d; 

    b.num = 3; 
    d.num = 4; 
    d.B::num = 5; 

    cout << b.num << endl; 
    cout << d.num << endl; 
    cout << d.B::num << endl; 

    return 0; 
} 
2

당신이 보인다 클래스의 인스턴스 및 클래스가 있습니다. 그것들은 다른 것들입니다. 모든 정수가 같은 값이 아닌 것과 마찬가지로, 클래스의 다른 인스턴스는 같은 값이 아닙니다.

파생 클래스가 기본 클래스에서 상속을 받으면 파생 클래스의 인스턴스에는 기본 클래스의 인스턴스 (실제로는 서브 인스턴스)가 있습니다.

virtual 키워드를 사용하지 않으면 파생 클래스 인스턴스의 하위 인스턴스는 기본적으로 기본 클래스의 완벽하게 정상적인 인스턴스입니다. 파생 된 이름에서 파생 된 이름의 멤버 변수를 기반으로 만들면 실수로 인해 기반의 하위 인스턴스에 변수가 숨겨집니다. 숨겨진 변수를 포인터 나 참조를 통해 액세스하거나 Base::x 구문으로 정규화하여 하위 인스턴스 변수를 가져올 수 있습니다.

static 변수에 액세스하는 것처럼 보이지만, Base::x 구문은 static이 아니더라도 파생어에서 숨길 수있는 기본 항목의 이름을 나타 내기 위해 사용됩니다.

나는 이것이 virtual 사례에 대해서만 사실이라고 언급했다. 자,베이스에있는 virtual 메소드는 파생에서 오버라이드 될 수 있습니다. virtual 메서드는 실제 methid에 대한 포인터 인 것으로 생각할 수 있습니다. 즉, 파생 된 인스턴스를 생성하고 파생 된 인스턴스의 기본 하위 개체의 virtual 메서드 포인터가 파생 된 메서드를 가리키는지를 변경합니다. 그런 다음 기본 포인터를 가져도 virtual 메서드를 호출하면 파생 된 메서드를 호출 할 수 있습니다.

virtual의 기타 사용은 상속시입니다. virtual없이 상속받은 경우 기본 클래스 인스턴스가 인스턴스의 '시작'에서 상속 순서에 따라 설명 된 순서대로 연결된 것처럼 보입니다. virtual으로 상속하는 경우 대신 기본 인스턴스가 파생 된 개체와 관련된 위치를 나타내는 오프셋 테이블이 있습니다. 이것은 주로 virtual없이 주어진 파생어에서 여러 개의 하위 인스턴스를 가질 수 있다는 점에서 중요합니다. 단 하나의 wirh virtual 상속입니다.

위의 일부는 표준에 명시된대로가 아니라 컴파일러가 설명 목적으로 표준을 구현하는 방법입니다.

+0

+1 (마지막 비트를 "기본값"이라고 부르지는 않겠지 만 결국에는 명시 적 범위 이름과 관련됩니다). – jogojapan

+0

롤, 그 중 하나에 동의 – Enigma

+0

고마워요, 에니그. –