2014-12-15 6 views
0

클래스는 상속 및 구성에 관한 것입니다. 최소 권한 원칙과 관련된 const 키워드를 사용하고 있습니까?최소 권한 및 const 키워드의 원칙

나는 상속과 구성을 이해하고 있으며 그것을 이해하지만 최저 특권의 원칙은 무엇인가? 누구든지 내게 그것을 설명 할 수 있고 최소한의 권한을 가진 원칙을 포함하도록 코드를 수정하는 방법은 있습니까?

class A { 
    int i; 
public: 
    A(int ii) : i(ii) {} 
    ~A() {} 
    void f() const {} 
}; 

class B { 
    int i; 
public: 
    B(int ii) : i(ii) {} 
    ~B() {} 
    void f() const {} 
}; 

class C : public B { 
    A a; 
public: 
    C(int ii) : B(ii), a(ii) {} 
    ~C() {} // Calls ~A() and ~B() 
    void f() const { // Redefinition 
    a.f(); 
    B::f(); 
    } 
}; 

int main() { 
    C c(47); 
} ///:~ 
+1

Const는 conext에 기반한 부작용이있는 기능을 허용하지 않기 위해 사용할 수있는 최소 권한의 주체와 관련이 있거나 기능에 부작용이 없다는 약속을 제공합니다. 그게 당신의 코드와 관련이 있습니다. 나는 모른다 ... f는 재정의가 아니라 메소드 숨기기입니다. – IdeaHat

+1

// Calls ~ A() 주석이 잘못되었습니다. 귀하의 A 인터페이스에서 가상의 아무것도, 그래서 당신이 그러한 개체에 A * 포인터를 잡고 있다면 B 또는 C의 어떤 방법을 호출하지 않을거야. – xryl669

답변

0

당신은 가장 좋은 방법은 명시 적으로 소멸자는 클래스 상속 트리 내에서 recrusively 호출 보장하기 위해 가상 소멸자를 선언하는 것입니다 알아야 할 모든 1 일. 이 특정 인스턴스의 경우 작동하지만, 기본 포인터를 통해 클래스를 삭제하면 소멸되지 않는 소멸자가 생깁니다 (예 : B * ptr = new C (47); delete ptr; 소멸자가 호출되지 않음).

최소 권한 원칙과 관련하여 const 키워드는 f() 함수를 실행하는 동안 클래스 멤버를 변경하지 않을 것이라고 컴파일러에 알려줍니다.

즉, f() 내에서 암시 적 this 매개 변수는 상수가됩니다. a 또는 B를 변경할 수 없습니다. i.

Const 식별자는 컴파일러에서 코드에 대해 읽기 전용 최적화를 수행하는 데 매우 유용합니다.

당신이 최소한의 권한 원칙에 코드를 연결하려면

을 다음과 같은 당신이 그것을 언급 할 수 있습니다 "이 함수를 재정의 할 때마다, 당신은 클래스 내부의 권한을 읽고합니다".

+1

여기서 소멸자를 가상으로 선언 할 필요가 없습니다. '~'와'~ B'는'c'가 파기 될 때 실행됩니다. – Henrik

+1

@Henrik이 특별한 경우에 동의하지만 좋은 습관은 좋은 습관입니다. 도중에 B * ptr = new C (11)를 사용하면 어떨까요? 나는 주된 대답조차도하지 않는 모범 사례 때문에 투표에 동의하지 않습니다. 그러나 공헌하는 좋은 방법! – MichaelCMS

+0

대답의 첫 번째 문장은 잘못되었습니다. 그것을 업데이트하고 파생 클래스의 소멸자가 호출되지 않은 정확한 상황을 진술하면, 나는 downvote를 제거 할 것이다. – Henrik