Почему компилятор не жалуется в определении конструктора класса Derived? - PullRequest
4 голосов
/ 13 ноября 2011

Обратите внимание, что конструктор класса Derived имеет ii в качестве первого аргумента, но аргумент, переданный Base, был специально сделан равным i.

class Base
{
    protected:
    int i;

    public:
    Base(int i) : i(i) {}
};

class Derived : public Base
{
    private:
    int k;

    public:
    Derived(int ii, int k) : Base(i), k(k) {}  // Why not C2065: 'i' undeclared identifier
};

int main()
{

}

Ответы [ 2 ]

7 голосов
/ 13 ноября 2011

Поскольку i является переменной-членом, унаследованной от Base, поэтому она определена . Вы можете свободно обращаться к переменным-членам в списках инициализаторов, но вы делаете доступ к переменной до ее инициализации, что, как я считаю, является неопределенным поведением.

3 голосов
/ 13 ноября 2011

Потому что он видит i из базового класса и использует его в инициализаторе. Если вы измените защищенный на частный, вы получите сообщение об ошибке Base::i как частный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...