Почему я не могу получить доступ к защищенному участнику от экземпляра производного класса?

Я попробовал Lazy C ++, но он устарел и больше не поддерживается. Он также не поддерживает последний стандарт C ++ 14.

Вот почему я решил написать свой собственный инструмент на Java, используя ANTLR4. Она называется Score, и вы можете найти ее здесь: https://github.com/underrated/Score

. На данный момент она только зарождается и может быть полна ошибок, но я планирую Улучши это. Так что попробуйте, если хотите, и сообщайте о любых ошибках на странице проекта github. Я постараюсь исправить их как можно быстрее.

13
задан Shog9 8 June 2009 в 22:41
поделиться

7 ответов

да, защищенные члены доступны производным классам, но вы обращаетесь к ним в функции main (), которая находится вне иерархии. Если вы объявите метод в классе B и получите доступ к num, все будет в порядке.

33
ответ дан 1 December 2019 в 17:16
поделиться

Да, защищенные члены доступны производному классу, но только изнутри класса.

пример:

#include <iostream>

class A { 
   protected:
   int num;
};

class B : public A {    public:
   void printNum(){
      std::cout << num << std::endl;
   }

};

main () {
   B * bclass = new B ();
   bclass->printNum();
}

распечатает значение num , но доступ к num осуществляется из класса B . num должен быть объявлен общедоступным, чтобы иметь к нему доступ как bclass-> num .

14
ответ дан 1 December 2019 в 17:16
поделиться

Но вы не получаете доступ к нему из производного класса. Вы получаете доступ к нему из main ().

7
ответ дан 1 December 2019 в 17:16
поделиться

«Защищенный» означает защищенный от доступа за пределами функции-члена или функции-члена производного класса. «Основная» функция не является членом ни одного класса, но пытается получить прямой доступ к переменной-члену.

3
ответ дан 1 December 2019 в 17:16
поделиться

Вы видите именно то, что ожидалось. Попробуйте это - http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers/ для получения информации о спецификаторах доступа наследования.

1
ответ дан 1 December 2019 в 17:16
поделиться

При использовании класса на самом деле нет разницы между защищенными и закрытыми членами. Ни один из них недоступен для всего, что использует этот класс.

class A {
    private: int privateNum;

    protected: int protectedNum;

    public:  int publicNum;

    void SetNumbers(int num) {
        privateNum = num; //valid, private member can be accessed in member function
        protectedNum = num; //valid, protected member can be accessed in member function
    }
};

void main() {
    A classA;
    classA.privateNum = 1; //compile error can't access private member
    classA.protectedNum = 1; //compile error can't access protected member
    classA.publicNum = 1; //this is OK
    classA.SetNumbers(1);  //this sets the members not accessible directly
 }

Разница вступает в силу при наследовании от класса с защищенными членами.

class B : public A {
};

Все закрытые члены базового класса по-прежнему являются закрытыми и не будут доступны для производного класса. С другой стороны, защищенные члены доступны унаследованному классу, но по-прежнему недоступны за пределами унаследованного класса.

class B : public A {
 public:
   void SetBNumbers(int num) {
       privateNum = num; //compile error, privateNum can only be accessed by members of A, not B
       protectedNum = num; //this works, as protected members can be accessed by A and B
   }
};

void main() {
  B classB;
  classB.publicNum = 1; //valid, inherited public is still public
  classB.protectedNum = 1; //compile error, can't access protected member
  classB.privateNum = 1; //compile error, B doesn't know that privateNum exists
  classB.SetBNumbers(1); //this sets the members not accessible directly
}
4
ответ дан 1 December 2019 в 17:16
поделиться

Он доступен в рамках функций B, но вы пытаетесь получить к нему доступ в main.

9
ответ дан 1 December 2019 в 17:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: