2013-07-08 2 views
0

C++ 11 표준의 단락 7.3.3.p1 및 p3은 모두 using-declaration 생성자의 이름을 참조합니다. 왜 이것이 필요한가? 아래 코드는 기본 클래스 A의 생성자가 파생 클래스 B에서 예상대로 표시되는 것을 보여줍니다.생성자의 이름을 지정하는 using 선언이 필요한 이유는 무엇입니까?

class A 
{ 
    int i; 

    public: 
    A() : i(0) {} 
    A(int i) : i(i) {} 
}; 

class B : public A 
{ 
    public: 
// using A::A; 
    A f1() { return A(); } 
    A f2() { return A(1); } 
}; 

int main() 
{ 
    B b; 
    A a1 = b.f1(); 
    A a2 = b.f2(); 
} 

나는 아무것도 위 using A::A;을 주석 경우는 프로그램 실행에 변경합니다. 이 경우 A(int i) 인 부모 클래스에서 기본이 아닌 생성자 상속에 대한 의미 것

+0

부모 클래스에서 기본이 아닌 생성자 (예 :'A (int i)'를 사용하여'B '를 생성하는 것을 의미한다고 생각합니다. –

+0

@JoeZ 여기에 사용 선언이 필요하다고 생각하지 않습니다. – Belloc

+1

"상속하는 생성자"를 찾으십시오. – Xeo

답변

3

. 과 같이 주에서 선언을 변경합니다

int main() 
{ 
    B b(42); // Want to forward this to A::A(int) 
    ... 
} 

using A::A 절없이 다음과 같은 컴파일러 오류 (++ g에서 적어도 4.8.0) 얻을 것이다 :

co.cpp: In function ‘int main()’: 
co.cpp:20:11: error: no matching function for call to ‘B::B(int)’ 
    B b(42); 
     ^
co.cpp:20:11: note: candidates are: 
co.cpp:10:7: note: B::B() 
class B : public A 
    ^
co.cpp:10:7: note: candidate expects 0 arguments, 1 provided 
co.cpp:10:7: note: constexpr B::B(const B&) 
co.cpp:10:7: note: no known conversion for argument 1 from ‘int’ to ‘const B&’ 
co.cpp:10:7: note: constexpr B::B(B&&) 
co.cpp:10:7: note: no known conversion for argument 1 from ‘int’ to ‘B&&’ 

을하지만 당신은을 추가하는 경우 using A::A 선언을 다시 컴파일하면 깨끗하게 컴파일됩니다. b(42)A::A(int i)으로 끝납니다.

+1

"상속하는 생성자"라고합니다 –

+0

더 많은 커피가 필요합니다. 나는 s/forwarding/inheriting/above이다. 감사. –

+1

오른쪽, +1 지금 :) –