Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
icpu
346 / 260 / 53
Регистрация: 10.03.2011
Сообщений: 1,209
Записей в блоге: 2
#1

Унаследоваться от базового класса и переопределить часть его данных - C++

06.08.2014, 18:36. Просмотров 728. Ответов 21
Метки нет (Все метки)

Есть базовый класс с некоторыми (protected) данными, в том числе объявленными const, и (public) виртуальными функциями. Требуется унаследоваться от него и переопределить часть этих данных.

Проблема - const члены класса. Как можно переопределить эти члены так, чтобы изменения подхватывали базовые методы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2014, 18:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Унаследоваться от базового класса и переопределить часть его данных (C++):

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

Вызов метода производного класса через обращение к методу базового класса - C++
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...

Создание указателя типа базового класса на экземпляр производного класса - C++
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса - наследника, для чего это может применяться?

Перегрузка оператора >> для дочернего класса от базового виртуального класса - C++
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием должного времени на поиск ответа в глубинах учебников,...

Указатель на объект базового класса и адрес объекта производного класса - C++
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; } ~Class1() {delete j;}

Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса - C++
Помогите пожалуйста новичку! (мне). Я хочу создать динамически расширяющийся массив указателей на базовый абстрактный класс,...

21
icpu
346 / 260 / 53
Регистрация: 10.03.2011
Сообщений: 1,209
Записей в блоге: 2
06.08.2014, 22:31  [ТС] #16
DrOffset, чисто для академических познаний, как можно сделать константный статический объект, переопределяемый потомками? Псевдоконстантный с параметрами по умолчанию - это понятно. А вот статик конст? А то мало ли, вдруг герой-имбицил решит сменить, к примеру, имя раздела в базе данных посреди выполнения программы.
0
DrOffset
7349 / 4449 / 1009
Регистрация: 30.01.2014
Сообщений: 7,293
06.08.2014, 22:33 #17
Цитата Сообщение от Tulosba Посмотреть сообщение
А причем тут private?
А приват тут очень даже причем.
Если константа в private, адрес ее нигде не берется, friend функций нет, то компилятор вполне может не размещать ее в памяти, а просто подставить значение во всех вычислениях. Вот в случае с public такое уже не прокатит, т.к. компилятор не вправе делать предположение о том, что адрес никогда не будет взят.

Добавлено через 2 минуты
Цитата Сообщение от icpu Посмотреть сообщение
Псевдоконстантный с параметрами по умолчанию - это понятно. А вот статик конст? А то мало ли, вдруг герой-имбицил решит сменить, к примеру, имя раздела в базе данных посреди выполнения программы.
static - это считай глобальный объект. Так что именно переопределить не получится
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.08.2014, 22:36 #18
DrOffset, я не про выкидывание как таковое, а про private. Будь оно public или protected разве это бы что-то поменяло?

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
компилятор не вправе делать предположение о том, что адрес никогда не будет взят.
Для интегральных типов можно было форсировать всё это инициализацией в классе. Тогда взятие адреса уже будет ошибкой этапа компиляции.
0
DrOffset
7349 / 4449 / 1009
Регистрация: 30.01.2014
Сообщений: 7,293
06.08.2014, 22:44 #19
Цитата Сообщение от Tulosba Посмотреть сообщение
Будь оно public или protected разве это бы что-то поменяло?
Конечно поменяло бы. У него ведь библиотека.
Предположим, что использование статической константы А имеется только в одной единице трансляции. В заголовочном файле соответственно объявление класса. Константа в private, friend-функций, определенных в других единицах трансляции нет. Означает, что раз адрес не был взят в той единственной единице трансляции, где используется А, значит он не будет взят более нигде, т.к. переменная в private. (Я вот точно такое же поведение наблюдал на примере функций класса, которые компилятор выкидывал, если они были в private и не вызывались более нигде, кроме как в одной единице трансляции (где определен класс)). Но у нас библиотека, поэтому protected и public не позволят делать эту оптимизацию, т.к. неизвестно будет ли брать наследник или внешний пользователь адрес переменной или нет.

Добавлено через 2 минуты
Цитата Сообщение от Tulosba Посмотреть сообщение
Для интегральных типов можно было форсировать всё это инициализацией в классе. Тогда взятие адреса уже будет ошибкой этапа компиляции.
Это ты разговор в сторону уводишь
2
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 689
Записей в блоге: 1
07.08.2014, 09:57 #20
icpu, я в упор не понимаю вашей проблемы. Зачем вам именно наследоваться от вашого вшитого в либу класса? Просто использовать нельзя?
0
icpu
346 / 260 / 53
Регистрация: 10.03.2011
Сообщений: 1,209
Записей в блоге: 2
07.08.2014, 11:18  [ТС] #21
CyberSolver, а как иначе получить доступ к protected полям для модернизации алгоритма? Собственно, проблема решена. Тупым изменением исходников.

Хозяйке на заметку: Если делаете static const поля, храните и возвращайте их виртуальной функцией. И будет вам счастье!
C++
1
2
3
4
5
6
7
8
class cHappiness{
private:
     static const std::vector <int> someVector;
protected:
     virtual const std::vector <int> & myNigga(){return someVector;}
};
 
const std::vector<int> cHappiness::someVector(size,data);
0
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 689
Записей в блоге: 1
07.08.2014, 12:15 #22
Цитата Сообщение от icpu Посмотреть сообщение
Собственно, проблема решена. Тупым изменением исходников.
Ну судя по тому, что вы сказали, это просто неудачная архитектура, и иначе никак. Magic numbers — это плохо.
0
07.08.2014, 12:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2014, 12:15
Привет! Вот еще темы с ответами:

Как построить экземпляр дочернего класса на основе готового экземпляра базового класса? - C++
Если уже есть готовый объект базового класса. Могу я построить экземпляр дочернего на его основе, (напр., получив такой базовый объект...

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса - C++
Класс В является производным от класса А. Определить обработчик исключительной ситуации на преобразование указателя базового класса А на...

Реализовать оператор= для присваивания объекта класса-потомка объекту базового класса - C++
Есть два класса A и B, причем класс B является потомком A. Как реализовать следующее: obj_A = obj_B и obj_B = obj_A? Добавлено через 9...

Создать массив указателей базового класса и присвоить ему адреса каждого из екземпляров класса - C++
Всем привет. Есть условие задачи: Дан базовый класс Base у которого есть метод my_name, метод выводит сообщение This is Base class. От...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru