2011-11-13 1 views
4

Derived 클래스 생성자는 첫 번째 인수로 ii을 갖지만 Base에 전달 된 인수는 목적 상 i과 동일하게 만들어졌습니다.컴파일러가 파생 클래스 생성자의 정의에 불만을 나타내지 않는 이유는 무엇입니까?

class Base 
{ 
    protected: 
    int i; 

    public: 
    Base(int i) : i(i) {} 
}; 

class Derived : public Base 
{ 
    private: 
    int k; 

    public: 
    Derived(int ii, int k) : Base(i), k(k) {} // Why not C2065: 'i' undeclared identifier 
}; 

int main() 
{ 

} 
+2

확실히 컴파일러는 코드가 단위 변환 된 변수를 사용한다는 것을 알기에 충분한 정보를 가지고 있습니다. 개발 팀이 귀중한 인력을 사용하여 (VS2010의 일부 C++ 11 지원과 같이)이 대신 다른 것을 개발하기로 결정했기 때문에 불평하지 않습니다. –

답변

7

i 때문에 Base로부터 상속 멤버 변수이므로 정의이다. 이니셜 라이저 목록의 멤버 변수에 자유롭게 액세스 할 수 있지만 초기화 작업을 수행하기 전에 변수에 액세스하는 것으로 정의되지 않은 동작입니다.

+0

이 부분이 유효한 예를 들어 주시겠습니까? – Ayrosa

+0

@jaayrosa 무엇이 유효할까요? 기본 멤버를 초기화 하시겠습니까? 이 경우,'Base'가'i'를 초기화하는 생성자를 가지고 있지 않다면'Derived (int ii, int k) : i (ii), k (k) { }'. 그러나 초기화되지 않은 변수를 인수로 전달하는 것은 유효하지 않습니다. –

+0

당신의 예가 꽤 분명합니다. 필자가 이해할 수없는 것은 왜 컴파일러가 C2065를 방출하지 않는가하는 것입니다. 왜냐하면 'Base'로 전달 된 변수가 'Derived'로 전달 된 변수와 다르기 때문입니다. – Ayrosa

3

기본 클래스에서 i을보고 이니셜 라이저에 사용하고 있기 때문에. 개인 정보 보호를 개인 정보로 변경하면 Base::i은 (는) 비공개로 설정됩니다.

관련 문제