2012-07-08 2 views
1

상속에 대한 몇 가지 개념에 대해 의심 스럽습니다. 내가 아는 바를 말하고 있습니다. 내가 틀렸다면 나를 교정하십시오.간단한 상속 후 copy-constructor을 호출합니다.

기본 클래스의 전용 멤버는 파생 클래스에서 상속되지만 파생 클래스는 어떤 방식으로도 액세스 할 수 없습니다.

보호 된 기본 클래스 멤버는 파생 클래스에서 상속되지만 파생 클래스는 일부 멤버 함수를 통해 직접 액세스 할 수 없습니다. 다음 코드에서 이제

:

class A 
    { 
     protected: 
     A(const A&){} 
     A operator=(const A &){} 
     int t; 
     public: 
     A(int r) {t=r;} 
     A(){t=0;} 
    }; 

class B : public A 
     { 
     A a; 
     public: 
     void make(void) 
     { 
     //A b(a);  //LINE 1 -------COPY CONSTRUCTOR BEING CALLED ---protected member of base class 
     cout<<t; //LINE 2 -------protected member of base class 
     } 
     }; 

    int main() 
    { 
     B b; 
     b.make(); 
     return 0; 
    } 

왜 LINE 1 오류가오고있다?

왜 A 개체에 대해 복사 생성자를 호출 할 수 없습니까? 사전

답변

5

보호 된 멤버

많은 많은 고맙습니다은 건설, 파괴하는 동안, 같은 완전한 개체의 다른 구성원에 의해 액세스, 또는 this 포인터 (*)를 통해 할 수있다. 하여 예 클래스 계층 구조

하기, B 목적은 두 유형 A의 하위 객체를 갖는다 : 그것은 A로부터 유도하여 얻는다

  • 기본 클래스 서브 오브젝트, 및
  • a라는 데이터 멤버 하위 개체, 그것은 a이라고 선언함으로써 얻습니다. 첫 번째는 직접 this 포인터를 사용하기 때문에

B의 회원 만이 아닌 두 번째에서 첫 번째 A 하위 객체에서 보호 된 멤버에 액세스 할 수 있습니다 (표현식 cout << tcout << this->t에 의미와 동일 참고). 데이터 멤버의 멤버

액세스가 직접 this 포인터를 사용하지 않는 : 당신이 B::make에서 this->a.t에 액세스하려고 경우 this 포인터는 t에 액세스하는 데 직접적으로 사용되지 않습니다. A b(a); 선언에서 복사 생성자는 this이 아니라 구성 할 새 A 객체의 경우 b이라는 로컬 변수로 호출됩니다.


(*) 또는 물론, 그것을 선언하는 클래스의 모든 회원 : B의 멤버 함수가 B

+0

의 다른 멤버 함수를 호출 할 수 있습니다 그것은 우리가 할 수 없음을 의미 파생 클래스에서 보호되는 경우 기본 클래스 객체를 만드시겠습니까? – Luv

+0

생성자는 또한이 포인터를 사용합니다. 즉, 모든 기본 클래스 생성자가 보호되는 경우 기본 클래스의 파생 클래스로 객체를 만들 수 없습니다. – Luv

+0

@Luv : 클래스의 모든 생성자가 보호 된 경우 이 클래스는 다른 클래스 유형의 기본 클래스로만 생성 될 수 있습니다. 파생 클래스는 기본 클래스 하위 객체에 대해 보호 된 생성자를 호출 할 수 있습니다. –