2016-09-01 9 views
3

개인 상속 기본 클래스 개체와 자식 개체 사이에 다음 세 가지 유형 변환이 있는데 두 개는 작동하지만 마지막 개체는 작동하지 않습니다. 다른 결과를 초래하는 것이 궁금합니다.개인 기본 클래스에 대한 세 가지 명시 적 상속 중 차이점

#include<iostream> 
#include <string> 
using namespace std; 
class test :private string 
{ 
public: 
    test(string st) :string(st){} 
    void show(); 
}; 

void test::show() 
{ 
    cout << (string)*this << endl; // typecasting 1, works, display "abcd" 
} 
int main() 
{ 
    test a("abcd"); 
    a.show(); 

    cout << (string &)a << endl; //typecasting 2, works, display "abcd" 

    cout<<(string)a<<endl; //typecasting 3; error C2243: 'type cast' : conversion from 'test *' to 'const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &' exists, but is inaccessible  
} 

a은 '* this'와 동일하지 않습니다. 둘 다 객체이기 때문에? 그렇다면 No.1은 왜 작동합니까?
범위 때문에 그렇다면 왜 No.2가 작동합니까? 아무도 그들 사이의 차이를 만드는 각각의 뒤에 메커니즘을 설명해 주시겠습니까?

또한 첫 번째 방법은 문자열 개체를 만드는 것으로 보입니다. 개인 상속 된 경우 기본 클래스 참조를 파생 클래스 개체로 설정할 수 없습니다. 그러면 임시 문자열 객체가 어떻게 생성됩니까?

미리 감사드립니다.

+0

직접 값을 사용하여 상속 캐스팅을 실제로 수행 할 수 없습니다. 이것은 보통 포인터와 참조에서만 작동합니다. '*'는'const '이기 때문에 왜 여기에 "작동한다". 'string & '와 동일합니다. 그러나 직접 값을 사용하여 한 유형을 다른 유형으로 실제로 캐스팅 할 수는 없습니다. 캐스트가 어떤 점에서 부정적인 부작용이 있는지 확실하지 않습니다. (값에 대한 참조를 캐스팅하고 반대의 경우도 마찬가지입니다.) 또한 다른 사람들을 위해서 : 나는 이것이 테스트 코드라는 것을 알고 있지만 실제 프로젝트에서 그런 코드를 작성하지 마라.) – Hayt

+0

고마워. 기본 클래스 참조를 파생 클래스 객체로 설정할 수 없을 때 임시 문자열 obj가 생성되는 방식을 묻습니다. 우리가 명시 적 배회를 할 때 비밀리에'* this'를 기본 클래스에 대한 참조로 취급합니까? 또한, 나는 실제 프로젝트에서 이것을하지 않을 것이다 : 나는 오타로 그것을 가로 질렀다. –

+0

'* this'는'const &'타입이라고 언급했다.좀 참조 할 수있게 해주시겠습니까? 나는 그것을 보았지만 유익한 정보를 찾지 못해 미안하다. 아마도 핵심 단어가 너무 광범위하게 사용되기 때문일 것이다.) 감사합니다. –

답변

2

test 개인적으로 teststring 인 것을 "알고"있지만 외부의 사람은 그렇지 않습니다. 다음과 같이 첫 번째 경우

, 무슨 일이 있습니다 :

  1. 외부 test (main에서), 당신은 show 메서드를 호출합니다. 대중적이기 때문에 괜찮습니다.

  2. 이제 show 안에 코드는 string이므로 코드는 test이기 때문에 유형을 알고 있습니다. 변환은 정상입니다.

세 번째 경우에는 변환을 외부에서 시도하고 있습니다 (main). test 외부의 main "알지 못함"은 teststring입니다.

두 번째 사례는 어떻게 작동합니까? C-style cast from a derived to public base을 (를) 수행 중입니다. 놀랍게도, 이것은 허용됩니다 (반드시 좋은 스타일은 아닙니다!). 표준 §5.4/7 :이 허용 대답 인용

(임의로에 const_cast 동작 하였다) 다음 static_cast 및 reinterpret_cast 조작 명시 형식 변환의 주조 표기법을 사용하여 수행 될 수있다 기본 클래스 유형에 액세스 할 수없는 경우에도 파생 클래스 유형의 객체 또는 파생 클래스 유형의 lvalue에 대한 포인터를 명시 적으로 포인터 또는 명확한 기본 클래스 유형에 대한 참조로 변환 할 수 있습니다.

+0

고마워요. 많이. 기본 클래스 참조를 파생 클래스 개체를 설정할 수없는 경우 임시 문자열 obj 어떻게 만들어 지는지 물어 봐도 될까요? 그것은 또한 '테스트'클래스 내부에서 그들은 기본 클래스 참조를 설정할 수 있도록 상속 알고 있기 때문에 –

+0

@FlowingCloud 첫 번째 사례에 대해 이야기하고 있습니까? –

+0

예, 첫 번째 사례에 대해 얘기했습니다. 감사합니다. –