2017-03-29 2 views
0

: 초보자의 질문에 대한전화는 몇 가지 "전문"필드를 사용하는 방법을 상속 예를 들어

struct A { 
    ~A() { 
     cout << me << ": destructor" << endl; 
    } 
    const string me = "A"; 
}; 

struct B : A { 
    const string me = "B"; 
}; 

int main() { 
    { 
     A a; 
     B b; 
    } 
    cout << "----\n"; 
    return 0; 
} 

죄송합니다, 나는 단지 다음과 같은 출력이 궁금 해요 :

A: destructor 
A: destructor 
---- 

두 번째 줄에서 I B: destructor을 기다리고있었습니다. 이유를 설명해 주시겠습니까? 예상 된 결과를보기 위해 소멸자를 다시 작성하지 않고 어떻게 코드를 수정할 수 있습니까?

+1

'A :: me'는'B :: me'와 완전히 관련이 없습니다. 그것들은 별개의 변수이며,'A'는'B :: me'에 대해서 아무것도 모릅니다. –

답변

2

선언 B :: me 그림자 A :: me,하지만 A :: ~ A는 분명히 A :: me를 사용합니다. 특히 ctors와 dtors에 대해 더 자세히 읽어야합니다. 특히 더 깊은 이해를 위해 가상 함수를 ctors와 dtors에 호출하면 안됩니다. 예제를 수정하는 방법은 다음과 같습니다.

struct A{ 
    string me; 
    A(string str = "A") : me(str){} 
    ~A(){cout<<me<<endl;} 
} 

struct B : A { 
    B(string str = "B") : A(str){} 
} 
+0

포인터를 가져 주셔서 감사합니다. – Murray