2012-06-06 4 views
15

저는 컴파일 타임 후에 수정할 수없는 클래스와 관련된 고유 ID와 같은 상수 필드가있는 기본 클래스를 갖고 싶습니다. 지금까지 static const 선언은 괜찮습니다. 자,이 기본 클래스를 상속 받고이 클래스의 자식이 동일한 필드를 갖지만 자신의 값을 갖고 있는지 확인하고 싶습니다. 어떻게해야합니까? C++ 클래스에서 가상 정적 상수 값을 선언 할 수 있습니까?

그들 모두가되고, 내가 클래스 A, BC을하고 싶습니다, 내가 그런 0의 int 값을 유지하는 ID 필드 Base라는 기본 클래스를 가지고 싶습니다의 말합시다 Base의 공용 어린이들과 나는이 어린이들이 1, 2, 3의 각각의 값을 갖는 ID 필드를 가질 것이라고 확신하고 싶다. ('make'에 의해 컴파일러 오류를 얻는 것과 같은 것을 의미한다. ID가 명시 적으로 선언되어 있음). 나는이 시나리오를 구축 관리 할 수 ​​있다면

, 내 기대는 Base* 포인터의 ID 필드를 요청, 내가 포인터가 new A(), new B() 또는 new C()으로 생성 여부에 따라 다른 값을 얻을해야한다는 것입니다.

내 생각에 IDvirtual static const으로 선언하는 것은 당연 하겠지만 당연히 이해가되지 않아서 컴파일러 오류가 발생합니다.

그러나 설명 된 결과를 얻으려면 어떻게해야합니까? (내가 상상할 수있는 유일한 것은 정수를 반환하고 함수 몸체에 값을 하드 코딩하는 가상 함수로 ID을 선언하는 것이지만 더 우아한 것을 찾고 있음)

감사합니다. 전진!

+0

다형성 멤버 함수 만 작동하고 데이터 멤버 유효하지 않습니다. – Mahesh

+0

템플릿을 기반으로 대안을 작성했습니다. http://stackoverflow.com/a/36797199/1529139 – 56ka

답변

15

static 방법은 virtual 일 수없고 데이터 멤버는 virtual 일 수 없습니다.

그러나 파생 클래스에서 static 필드를 숨기고 virtual 메서드를 사용하여 반환 할 수 있습니다.

class A 
{ 
public: 
    static const int ID = 0; 
    virtual int getID() { return A::ID; } 
}; 
class B : A 
{ 
public: 
    static const int ID = 1; 
    virtual int getID() { return B::ID; } 
}; 

는 대안 :

class A 
{ 
public: 
    A(int id = 0) : ID(id) {} 
    const int ID; 
    getID() { return ID; } 
}; 
class B : public A 
{ 
public: 
    B() : A(1) {} 
}; 
+0

예, 이것이 지금까지 내가 알고있는 유일한 해결책입니다. 그러나 이것을보다 우아하고 단순한 방법으로 해결할 방법이 없을까요? 또는 이것이 유일한 방법 일 경우 내 질문은 오히려 : 함수에서 작동하는 가상 상속이 데이터 멤버와 함께 작동하지 않는 이유는 무엇입니까? 나는 왜 실제로'정적 가상 '은 이해가 안되는 지 이해하지만 단순한'가상 const int'필드가 의미를 갖지 않는 이유를 이해할 수 없다. –

+0

@ SiskaÁdám 다형 적 행동이 아니기 때문에 데이터 멤버에 대해 정의됩니다. 그것은 언어가 설계된 방식입니다. 그리고 IMO는 좋은 일입니다. –

+0

@ SiskaÁdám 나는 대안을 올렸지 만 나는 여전히 첫 번째 것을 더 잘 찾는다. –

관련 문제