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

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

Войти
Регистрация
Восстановить пароль
 
 
icpu
321 / 226 / 43
Регистрация: 10.03.2011
Сообщений: 1,091
Записей в блоге: 2
#1

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

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

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

Проблема - const члены класса. Как можно переопределить эти члены так, чтобы изменения подхватывали базовые методы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2014, 18:36     Унаследоваться от базового класса и переопределить часть его данных
Посмотрите здесь:
Как скрыть из области видимости часть методов базового класса после наследования? C++
C++ Создать массив указателей базового класса и присвоить ему адреса каждого из екземпляров класса
Вызов конструктора базового класса из класса-наследника C++
Вызов метода базового класса из класса-потомка C++
Как переопределить конструктор класса C++
C++ Функция базового класса
Конструктор базового класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
icpu
321 / 226 / 43
Регистрация: 10.03.2011
Сообщений: 1,091
Записей в блоге: 2
06.08.2014, 22:31  [ТС]     Унаследоваться от базового класса и переопределить часть его данных #16
DrOffset, чисто для академических познаний, как можно сделать константный статический объект, переопределяемый потомками? Псевдоконстантный с параметрами по умолчанию - это понятно. А вот статик конст? А то мало ли, вдруг герой-имбицил решит сменить, к примеру, имя раздела в базе данных посреди выполнения программы.
DrOffset
7060 / 4201 / 949
Регистрация: 30.01.2014
Сообщений: 6,968
06.08.2014, 22:33     Унаследоваться от базового класса и переопределить часть его данных #17
Цитата Сообщение от Tulosba Посмотреть сообщение
А причем тут private?
А приват тут очень даже причем.
Если константа в private, адрес ее нигде не берется, friend функций нет, то компилятор вполне может не размещать ее в памяти, а просто подставить значение во всех вычислениях. Вот в случае с public такое уже не прокатит, т.к. компилятор не вправе делать предположение о том, что адрес никогда не будет взят.

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

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

Добавлено через 2 минуты
Цитата Сообщение от Tulosba Посмотреть сообщение
Для интегральных типов можно было форсировать всё это инициализацией в классе. Тогда взятие адреса уже будет ошибкой этапа компиляции.
Это ты разговор в сторону уводишь
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
07.08.2014, 09:57     Унаследоваться от базового класса и переопределить часть его данных #20
icpu, я в упор не понимаю вашей проблемы. Зачем вам именно наследоваться от вашого вшитого в либу класса? Просто использовать нельзя?
icpu
321 / 226 / 43
Регистрация: 10.03.2011
Сообщений: 1,091
Записей в блоге: 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);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2014, 12:15     Унаследоваться от базового класса и переопределить часть его данных
Еще ссылки по теме:
C++ Конструктор базового класса
Наследование конструктора из базового класса C++
Вызов перегрузки базового класса C++
Не наследует данные базового класса C++
Создание базового класса и наследника C++

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

Или воспользуйтесь поиском по форуму:
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
07.08.2014, 12:15     Унаследоваться от базового класса и переопределить часть его данных #22
Цитата Сообщение от icpu Посмотреть сообщение
Собственно, проблема решена. Тупым изменением исходников.
Ну судя по тому, что вы сказали, это просто неудачная архитектура, и иначе никак. Magic numbers — это плохо.
Yandex
Объявления
07.08.2014, 12:15     Унаследоваться от базового класса и переопределить часть его данных
Ответ Создать тему
Опции темы

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