가상 기본 클래스
C + + 클래스 간접 기본 클래스는 파생 된 클래스를 두 번 이상 수 있기 때문에 작업 등을 기반으로 최적화 하는 방법으로 클래스를 제공 합니다.공간을 절약 하 고 여러 상속을 사용 하는 클래스 계층 구조에서 발생 하지 않도록 하는 방법 가상 기본 클래스를 제공 합니다.
각 비가상 개체 복사본을 기본 클래스에 정의 된 데이터 멤버를 포함 합니다.이러한 중복 공간이 낭비 되 고 어떤 사본에 액세스할 때마다 원하는 기본 클래스 멤버를 지정 해야 합니다.
기본 클래스 가상 기본으로 지정 되 면이 간접 기본 클래스로 두 번 이상 데이터 멤버가 중복 되지 않고 역할을 합니다.가상 기반으로 사용 하는 모든 기본 클래스에서 데이터 멤버의 복사본 하나를 공유 합니다.
가상 기본 클래스를 선언 하는 경우는 가상 키워드는 파생된 클래스의 기본 목록에 나타납니다.
시뮬레이션 된 식사 줄을 보여 줍니다. 다음 그림에서는 클래스 계층 구조를 고려해 야 합니다.
시뮬레이션 된 점심 선 그래프
그림에서 Queue 기본 클래스 모두에 대해입니다 CashierQueue 및 LunchQueue.그러나 때 두 클래스 모두 결합 폼에 LunchCashierQueue, 다음과 같은 문제가 발생: 두 하위 개체 형식의 새 클래스를 포함 합니다. Queue, 하나에서 CashierQueue 와 다른 LunchQueue.다음 그림 (실제 메모리 레이아웃을 최적화할 수 있습니다.) 개념의 메모리 레이아웃을 보여 줍니다.
시뮬레이션 된 점심 Line 개체
두는 있습니다 Queue 에서 개체나 하위의 LunchCashierQueue 개체입니다.다음 코드에서는 선언 Queue 가상 기본 클래스로 사용할 수:
// deriv_VirtualBaseClasses.cpp
// compile with: /LD
class Queue {};
class CashierQueue : virtual public Queue {};
class LunchQueue : virtual public Queue {};
class LunchCashierQueue : public LunchQueue, public CashierQueue {};
virtual 키워드 수는 하위 개체의 복사본이 Queue 포함 됩니다 (다음 그림 참조).
시뮬레이션 된 점심 줄 개체와 가상 기본 클래스
클래스는 지정 된 형식의 비가상 구성 요소 모두 가상 구성 요소가 있을 수 있습니다.다음 그림에서 설명 하는 조건에서 발생 합니다.
같은 클래스의 가상 메서드와 비가상 구성 요소
그림에서 CashierQueue 및 LunchQueue 사용 하 여 Queue 가상 기본 클래스입니다.그러나, TakeoutQueue 지정 Queue 없습니다 가상 기본 클래스의 기본 클래스입니다.따라서, LunchTakeoutCashierQueue 형식의 두 하위 되었습니다 Queue: 포함 상속 경로에서 하나 LunchCashierQueue 를 포함 하는 경로 TakeoutQueue.이 다음 그림에 나와 있습니다.
개체 레이아웃을 가상 메서드와 비가상 상속
[!참고]
가상 상속 비가상 상속과 비교 했을 때 크기가 크게 혜택을 제공 합니다.그러나이 추가 처리 오버 헤드가 발생할 수 있습니다.
파생된 클래스가 가상 기본 클래스에서 상속 되는 가상 함수를 재정의 하는 경우와 생성자 또는 소멸자에 대 한 가상 기본 클래스에 대 한 포인터를 사용 하 여 기능을 파생 된 기본 클래스 호출 하는 경우 컴파일러는 가상 기본 클래스에 추가 숨겨진된 "vtordisp" 필드 발생할 수 있습니다./Vd0 컴파일러 옵션에는 숨겨진된 vtordisp 생성자/소멸자 치환 멤버의 추가 되지 않습니다./Vd1 컴파일러 옵션의 기본 필요 하지 어디에서 사용할 수 있게 합니다.모든 클래스 생성자와 소멸자가 가상으로 가상 함수 호출 경우에 vtordisps 해제를 설정 합니다.
/Vd 컴파일러 옵션 전체 컴파일 모듈에 적용 됩니다.사용은 vtordisp 표시 하지 않고 고 여 클래스 단위로 vtordisp 필드를 다시 사용할 수 있도록 하려면 pragma:
#pragma vtordisp( off )
class GetReal : virtual public { ... };
#pragma vtordisp( on )