закрытый typedef, видимый в производном классе - PullRequest
2 голосов
/ 31 августа 2009

У меня небольшая проблема с моим компилятором (VC ++ 6.0). На мой взгляд, такой код должен вызвать ошибку;

class Base
{
    private:
        typedef int T;
};

class Derived : private Base // Here the Base class can be inherited publicly as well. It does not play any role
{
    public:
        T z;
};



int main()
{
    Derived obj;
    obj.z = 7;
    return 0;
}

Этот фрагмент кода скомпилирован и запускается под VC ++ 6.0 без каких-либо проблем.

Что касается SW-Design, этот код не идеален. Ни один из членов класса не должен быть объявлен публичным. Но я не заинтересован в этом аспекте.

Моя проблема с typedef. Typedef объявлен в Базовом классе как закрытый. С моей точки зрения C ++, этот typedef не должен быть видимым ни для класса Derived, ни для функции main (). Но оба прекрасно их видят.

У кого-нибудь есть объяснение этому явлению?

Заранее спасибо

Necip

1 Ответ

7 голосов
/ 31 августа 2009

Это поведение не соответствует VC ++ 6.0, вы должны получить ошибку при определении Derived :: z. (За исключением случаев, когда у вас есть деловые причины использовать его, есть другие варианты, технически предпочтительные для VC ++ 6.0, который старый ).

...