2016-11-11 1 views
2

의 코드를 반복하지 않는 몇 가지 방법입니다. 클래스 B를 떠나서 클래스 C을 자세히 살펴 보겠습니다. I 클래스 C C1있다 wchich 상속 클래스 커플 등등 C2 및 ...가내가 <strong>B</strong> 및 <strong>C</strong> 있습니다 wchich 클래스 A에서 상속하는 추상 클래스 <strong></strong> 2 클래스가이 상속 클래스

class A{ 
protected: 
char symbol; 
public: 
virtual char get_symbol() = 0; 
}; 

class C : public A{ 
public: 
virtual char get_symbol() { return symbol;} 
}; 

class C1 : public C{ 
protected: 
char symbol = '#'; 
}; 

문제는 그 전 위한 get_symbol() 메소드를 호출 할 때 C1, C2 ... 개체 나는 C 및 일부 임의 문자에서 메서드를 가져 오는 중입니다. 다음과 같이 작성해야합니다 :

char get_symbol() { return symbol;} 

실제 기호를 얻으려면 모든 Cn 클래스를 사용해야합니다.

내 질문은 : 일명 적절한 코어 네트워크 오브젝트의 상징합니다 (C 형식 개체도 자신의 기호가없는)

감사

+0

'기호'의 의미가 '과부하'상태입니다. C 클래스에는 아이디어가 하나 있지만 C1 클래스에는 다른 아이디어가 있습니다. (추신 :'char symbol = 'C1'을 어떻게 가질 수 있습니까? 컴파일도합니까?) – John3136

+0

맞아요, 그냥 바보 같은 심볼 값 예제를주었습니다. – Dontumindme

+0

실제 코드를 사용하지 않으면 항상 함정입니다. 코드가 유효하지 않기 때문에 오타 등으로 투표를 종료하는 사람들이 생길 수 있습니다. 진짜 스 니펫을내는 것이 항상 좋습니다. – John3136

답변

2

CRTP을 코드 여분을 피하고 얻을 수있는 모든 솔루션이 정적 상속은 여기에서 도울 수 있습니다 :

struct A{ 
    virtual char get_symbol() const = 0; 
}; 

template<typename Derived> 
struct C : public A{ 
    virtual char get_symbol() const override { 
     return static_cast<Derived const&>(*this).symbol; 
    } 
}; 

struct C1 : public C<C1>{ 
    char symbol = '#'; 
}; 
관련 문제