2012-09-25 1 views
-3

필자는 고유 한 요구 사항을 갖고 있으며 솔루션을 찾지 못했습니다.기본 클래스 메서드에서 파생 된 클래스 멤버

class Base 
{ 
public: 
    void func() 
    { 
     //access the member say 'var' of derived class 
    } 
} 
  1. 베이스에서 파생 된 모든 클래스는 멤버 'VAR'을해야합니다 우리의 경우 필수입니다.
  2. 파생 클래스의 이름은 무엇이든 가능합니다. 이 공통의 멤버이기 때문에,

    class Base 
    { 
    public: 
        void func() 
        { 
         getVar(); 
        } 
        virtual int getVar() = 0; 
    }; 
    class Derived : public Base 
    { 
        int var; 
        virtual int getVar() { return var; } 
    }; 
    

    더 나은 디자인은 기본 클래스에서 var 낳게 될 것이다 :

+7

'Base'에 'var'이없는 이유는 무엇입니까? – hmjd

+0

이것은 OO의 기본 이론입니다. – thecoshman

+0

아, "의존성 반전". –

답변

6

당신은 그 멤버를 반환하는 virtual 기능이 필요합니다. 그렇지 않으면 C++에 반영 메커니즘이 없으므로 원하는 방식으로 클래스를 동적으로 검사하는 것은 문제가되지 않습니다.

+0

'getVar()'를 사용하는 것이 더 나은 방법 일 수 있습니다. 왜냐하면 값이 다소 업데이트되도록 보장되기 때문입니다. –

+1

@ MarkGarcia 귀하의 의견으로 _add_를 (를) 찾으려고 애쓰는 것이 무엇입니까? – sehe

9

파생 클래스의 모든 var은 동일한 유형이어야하므로 의미가 없으므로 간단하게 기본 클래스에 넣지 않으시겠습니까?

class Base 
{ 
public: 
    void func() 
    { 
     // use var 
    } 
protected: // allow derived classes to access 'var' 
      // and give it a value on construction 
    // where T == whatever type you want 
    Base(T v) : var(v){} 
    T var; 
}; 
+0

저는 이것을 고려했습니다. 그러나이 방법을 구현하지 않으려합니다. – Dexter

+6

@HellBoy : Erm ... * why? * – Xeo

+3

LOL. HellBoy, 그것은 재미있는 부분입니다 : D – Griwes