2009-03-01 3 views
1

정적 멤버 변수를 기본 클래스에 정의하고이 멤버 변수의 자체 인스턴스를 각각 사용하는 여러 파생 클래스를 갖는 것이 좋습니까?서브 클래 싱 된 클래스의 정적 멤버 변수

다음 코드는 성공적으로 컴파일되고 올바른 출력을 인쇄하지만 그와 같은 작업을 수행하는 것이 좋습니다. 다음 예제에서는 명시 적으로 s의 인스턴스 (string A :: s;를 호출하여)를 하나만 정의하면 어떻게 작동합니까?하지만 실제로 2 개의 인스턴스를 사용합니까?

class A 
{ 
    protected: 
    void SetS(string new_s){s = new_s;} 
    void PrintS(){cout << s << endl;}; 
    private: 
    static string s; 

}; 

class B : public A 
{ 
    public: 
    void foo(){ SetS("bbb"); PrintS();}; 
}; 

class C : public A 
{ 
    public: 
    void foo(){ SetS("ccc"); PrintS();}; 
}; 

string A::s; 

int main() 
{ 
    B b; 
    b.foo(); // results in output: bbb 
    C c; 
    c.foo(); // results in output: ccc 
    b.foo(); // results in output: bbb 
} 

답변

7

실제로 상속의 사용은 매우 이상합니다. 기본 클래스는 인터페이스를 이상적으로 정의하고 좋은 OO 설계 원칙에 따라 가능하면 거의 또는 전혀 상태를 포함하지 않아야합니다.

foo()은 호출 할 때마다 A::s의 값을 재설정하기 때문에 작동합니다. A::s의 주소를 인쇄 해보십시오. 개체가 하나뿐입니다. 값을 매번 설정하지 않고 다른 멤버 함수 bar()을 사용하여 여러 개의 개체를 사용하여 A :: s의 값을 읽으면이 작업이 작동하지 않습니다.

BC 개의 개체가 별도의 스레드로 만들어지면 동기화 문제가 발생할 수 있습니다. 당신은 UB로 끝날 것입니다.

+0

우수 답변. +1. –

+0

고맙습니다. 제 질문에 완전히 대답했습니다. –

+0

기본 클래스는 인터페이스를 정의해야합니다. 하지만 기본 클래스는 그냥 작동 확장 일 수 있습니다. –