당신이 보인다 클래스의 인스턴스 및 클래스가 있습니다. 그것들은 다른 것들입니다. 모든 정수가 같은 값이 아닌 것과 마찬가지로, 클래스의 다른 인스턴스는 같은 값이 아닙니다.
파생 클래스가 기본 클래스에서 상속을 받으면 파생 클래스의 인스턴스에는 기본 클래스의 인스턴스 (실제로는 서브 인스턴스)가 있습니다.
virtual
키워드를 사용하지 않으면 파생 클래스 인스턴스의 하위 인스턴스는 기본적으로 기본 클래스의 완벽하게 정상적인 인스턴스입니다. 파생 된 이름에서 파생 된 이름의 멤버 변수를 기반으로 만들면 실수로 인해 기반의 하위 인스턴스에 변수가 숨겨집니다. 숨겨진 변수를 포인터 나 참조를 통해 액세스하거나 Base::x
구문으로 정규화하여 하위 인스턴스 변수를 가져올 수 있습니다.
static
변수에 액세스하는 것처럼 보이지만, Base::x
구문은 static
이 아니더라도 파생어에서 숨길 수있는 기본 항목의 이름을 나타 내기 위해 사용됩니다.
나는 이것이 virtual
사례에 대해서만 사실이라고 언급했다. 자,베이스에있는 virtual
메소드는 파생에서 오버라이드 될 수 있습니다. virtual
메서드는 실제 methid에 대한 포인터 인 것으로 생각할 수 있습니다. 즉, 파생 된 인스턴스를 생성하고 파생 된 인스턴스의 기본 하위 개체의 virtual
메서드 포인터가 파생 된 메서드를 가리키는지를 변경합니다. 그런 다음 기본 포인터를 가져도 virtual
메서드를 호출하면 파생 된 메서드를 호출 할 수 있습니다.
virtual
의 기타 사용은 상속시입니다. virtual
없이 상속받은 경우 기본 클래스 인스턴스가 인스턴스의 '시작'에서 상속 순서에 따라 설명 된 순서대로 연결된 것처럼 보입니다. virtual
으로 상속하는 경우 대신 기본 인스턴스가 파생 된 개체와 관련된 위치를 나타내는 오프셋 테이블이 있습니다. 이것은 주로 virtual
없이 주어진 파생어에서 여러 개의 하위 인스턴스를 가질 수 있다는 점에서 중요합니다. 단 하나의 wirh virtual
상속입니다.
위의 일부는 표준에 명시된대로가 아니라 컴파일러가 설명 목적으로 표준을 구현하는 방법입니다.
하지만 두 개의 별개의 개체 인 'b'와 'd'가 있습니다. 'd.B :: num'은'd' 인스턴스 안에있는'B :: num'의 인스턴스를 가리 킵니다. 'b.num'은 완전히 다른 인스턴스의 일부입니다. – jogojapan
'd'와'b'는 서로 다른 객체이므로'dB :: num'과'bB :: num'은 분명히 다른 [sub] 객체가 될 것입니다 ('B :: num'은'static'이 아닙니다) . 네가 묻는 것을 내가 이해하고 있는지 모르겠다. –
변수를 "무시"할 수 없습니다. – Asha