2010-12-14 9 views
4

합법적입니까? 그렇다면 좋은 코딩 방법이라고 생각하십니까?기본 클래스 메서드를 사용하여 파생 클래스 멤버 초기화

나는 (중요하지 않은 세부 사항이 표시되지 않습니다) 이런 일을하고 싶지 :

class ItemStorage { 
    int size() const; 
}; 

class SpecialStorage : public ItemStorage { 
public: 
    SpecialStorage (...) : ItemStorage(...), items(ItemStorage::size()) {...} 
private: 
    int items; 
}; 

나는 방법 크기 가상이 아닌 경우가 OK임을 확신합니다. 가상 클래스이고 파생 클래스가이를 덮어 쓰지 않으면 어떻게됩니까?

답변

5

초기화하는 동안 개체의 초기화되지 않은 부분에 액세스하면 안됩니다. 항목이 초기화 될 때 ItemStorage가 이미 초기화 되었기 때문에 호출 크기는 실제로 괜찮습니다.

크기가 가상이고 덮어 쓰더라도 여전히 기본 버전을 호출합니다 (즉, 가상 메소드는 구성중인 레벨에만 바인딩 됨).

+0

+1 : ItemStorage의 생성자가 먼저 호출 된 것을 알지 못했습니다. – Puppy

+0

WOW. 빠른! 고마워. – watson1180

+0

명시 적으로 지정 되었기 때문에 기본 버전 만 호출합니다. 그렇지 않으면 생성중인 객체가 SpecialStorage이며,이 경우 호출은 안전하지 않을 수 있습니다 (아직 초기화되지 않은 멤버에 의존). – UncleBens

관련 문제