Наследование / Полиморфизм - я вынужден использовать «защищенные» переменные? - PullRequest
0 голосов
/ 17 января 2020

В настоящее время я работаю с Big C ++ 2nd Edition, используя Code :: Blocks 17.12, в главе о наследовании

В книге представлен тип защищенной переменной для случаев, когда вы хотите разрешить производному классу доступ к указанной переменной.

Книга также предупреждает, что защищенные элементы страдают от некоторых ловушек переменной publi c: в худших случаях производные члены класса могут повредить данные базового класса

Книга демонстрирует использование защищенного члена в программе часов в специальном разделе, в котором они представляют это, но в конечном коде они в конечном итоге пошли с установкой переменной на private и затем с использованием некоторых вспомогательных функций get_ для доступа к этим закрытым данным. Эта закрытая комбинация с использованием вспомогательных функций всегда возвращала ошибки в моей IDE, и мне не удалось это исправить

Возьмите этот простой пример, который я создал для P8.1, записи сотрудника для программиста, с Базовый класс сотрудника и производный класс программиста. Я создал следующий ctor с именем переменной и значением sal, установленным на защищенный статус в базовом классе

Programmer::Programmer(string p_name, double p_sal)
    :Employee(get_name(), get_sal())
{
    name=p_name;
    sal=p_sal;
}

С этим кодом программа работает отлично.

Исходя из учебника, если для переменных name и sal было установлено значение private в базе, то я должен иметь возможность выполнять код также, при условии, что я использую вспомогательную функцию get_, которую я создал для доступа данные.

Кто-нибудь может объяснить, в чем здесь проблема? Должен ли я быть в порядке с использованием защищенного или действительно есть способ сохранить все мои переменные закрытыми для классов?

Я также нашел это в https://docs.microsoft.com/en-us/cpp/cpp/protected-cpp?view=vs-2019

Защищенные члены, которые также объявлены как stati c, доступны для любого друга или функции-члена производного класса. Защищенные члены, которые не объявлены как stati c, доступны для друзей и функций-членов в производном классе только через указатель, ссылку или объект производного класса.

У меня нет до сих пор не рассмотрено c, поэтому я в конечном итоге попробовал несколько различных комбинаций с указателями и ссылками, ни одна из которых не сработала.

Я пытаюсь понять, когда использовать защищенный или использовать защищенный или частный книга не проясняет это. Есть идеи?

1 Ответ

0 голосов
/ 17 января 2020

По какой-то причине я подумал, что при вызове конструктора базового класса вам нужно было предоставить вспомогательные функции для доступа к частным данным.

Поскольку базовый ctor уже опубликован c, и путем передачи ему параметров для производный класс ctor, он будет правильно конструировать производный класс obj, позволяя get_ fun c читать его частные переменные

Programmer::Programmer(string p_name, double p_sal)
    :Employee(p_name, p_sal)
{}

Я не понял этого в книге, спасибо всем за помощь уточнения

...