상속 C ++ (11)의 생성자

https://en.cppreference.com/w/cpp/language/using_declaration

[있어서 를 상속 생성자 이 섹션.

사실,라고 "기본 클래스 생성자 전면은"좋습니다.

마찬가지로 문자열 클래스에서 상속,하지만 여전히 문자열 기능을 제공 mystring에. 새로운 시간은 여전히 ​​모드를 전달하는 매개 변수를 이전 초기화를 유지하고 싶다. 이 시간과 다시에 mystring에을 (기본 클래스를 호출) 더 이상의 문제입니다 달성했다.

그러나이 전에 단지 C ++ (11).

C 전에 기본 구성 모드 ++ 11 (후 11 또는 무관심 C ++), 기본 클래스의 각을 통해 첫 번째 기본 초기화 함수 호출. 그런 다음 필드는 기본 초기화 할 파생됩니다.

C ++ 사용자 정의 생성자, 당신은 초기화 목록에 11 전에 기본 클래스 생성자를 호출 할 수 있으며, 매개 변수를 전달할 수 있습니다. 기본 클래스 생성자는 여전히 다시 첫 번째 호출입니다.

11이 시작 C ++, 자료 :: 자료를 사용하여이 있었다, 표현, 컴파일러는 파생 클래스에서 해당 생성자를 찾을 수 없을 때, 당신은이 기본 클래스 자료에서 찾을 수 있습니다. 그 후에는 기본 생성자 다른 기본 클래스를 호출합니다, 파생 클래스 필드는 초기화 된 과제이다. (이것은 또한 11 C ++ 후 도입)

 

생성자를 상속

IF로 사용 선언이 (예를 들어, 정의되는 클래스의 직접베이스 생성자 지칭 자료 사용 :: 베이스 ) 유도 된 클래스를 초기화 할 때, 그베이스 (멤버 액세스 무시)의 모든 생성자는 과부하 해상도로 가시화된다.

이 무시됩니다 도입하여 선언의 접근성 : 오버로드 확인이 상속 생성자를 선택하면 해당 기본 클래스의 객체를 생성하는 데 사용하는 경우가 액세스 될 경우, 그것은 액세스 할 수 있습니다.

만약 상속 생성자 과부하 해상도 선택 하나의 이러한 파생 된 클래스의 객체를 초기화 한 후 Base생성자가 상속 생성자를 사용하여 초기화된다 상속되는 서브 오브젝트 및 기타 모든 기지의 부재 Derived부도 기본 생성자 것처럼 초기화 (기본 멤버 이니셜 라이저가 제공되는 경우, 그렇지 않으면 기본 초기화가 발생하는 데 사용됩니다). 전체 초기화 한 함수 호출로서 취급된다 상속 생성자의 파라미터 초기화 시퀀스 - 유도 전에 객체의 모든베이스 부재 또는 초기화한다.

 

번역은 아래 아마도 :

자료 : 자료를 사용하여, 사용 :

> 파생 클래스 초기화, 기본 클래스 생성자 오버로드 확인의 모든 눈에 보이는, 무시 권한 수정.

> 기본 클래스 생성자를 선택하면 다음 다음 "다른 기본 클래스"와 "파생 필드가"기본 기본 생성자로 초기화되는 기본 클래스를 초기화하는 데 사용합니다. (사용자가 디폴트의 초기화가 발생 제공하지 않는 경우, 제공되는 기본 이니셜 라이저를 사용).

> 기본 클래스의 생성자는 항상 호출 할 첫 번째입니다.

여기서 코드의 예이다 :

구조체 B1 {B1 ( INT , ...) {}};
구조체 B2 B2 {( 더블 ) {}}; 
 
INT  의 get (); 
 
구조체 D1 : B1 {
   사용 B1 : B1을;  // 상속 B1 (INT, ...) 
  INT (X);
  INT의 Y = GET (); 
}; 
 
보이드 테스트 () { 
  D1의 D ( 2 , 3 , 4 ); // OK : B1 B1은 (2, 3, 4)를 호출하여 초기화된다
                  // 다음 DX 인 디폴트 초기화 (에는 초기화가 수행되지 않는다)
                  //다음 DY의 get ()를 호출하여 초기화 
  D1 전자를,          // 오류 : D1은 기본 생성자가 
} 
 
구조체 B2 {: D2를
   사용하여 B2 : B2를; // 상속 B2 (더블) 
  B1의 B; 
}; 
 
D2의 F ( 1.0 );       // 오류 : B1은 기본 생성자가
 
 

상속 생성자의 생성자 중 하나의 서명이 일치하는 경우 다른 비 정적 멤버 함수의 사용 선언-와 같이 Derived버전이 발견하여,이를 룩업 숨겨져 Derived. 의 상속 생성자 중 하나가 경우 Base의 복사 / 이동 생성자와 일치하는 서명이하는 일 Derived, 그것은의 암시 적 생성을 방지하지 않습니다 Derived(다음과 유사한 상속 된 버전을 숨 깁니다 복사 / 이동 생성자 using operator=).

번역 : 간단히 말해, 자료를 사용한다 : 자료 후, 파생 클래스가 버전 덮어 쓰기를 재정의 할 수 있습니다. 컴파일러는 기본을 생성, 더 복사 / 이동 생성자가없는 경우,이 효과를 사용하지 않고 기본 클래스 / 이동 생성자의 파생 클래스를 복사, 그것은 기본 클래스를 사용하지 않습니다.

예제 코드 :

구조체 B1 {B1 ( INT ); };
구조체 B2 B2 {( INT ); }; 
 
구조체 D2 : B1, B2 {
   사용 B1 : B1 단계;
  사용 B2 :: B2를; 
  D2 ( INT );   // OK : D2 : D2 (INT) : 원피 모두 B1 B1 (INT) 및 B2 : B2 (INT) 
}; 
D2의 D2 ( 0 );    //은 D2 : D2 (int)를 호출

 

 

추천

출처www.cnblogs.com/xiang-yin/p/12075732.html