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

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

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

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

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

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

Проблема - const члены класса. Как можно переопределить эти члены так, чтобы изменения подхватывали базовые методы?
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++
Помогите пожалуйста новичку! (мне). Я хочу создать динамически расширяющийся массив указателей на базовый абстрактный класс,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
06.08.2014, 18:38 #2
icpu, напишите код, который вы хотите заставить работать.
icpu
323 / 228 / 43
Регистрация: 10.03.2011
Сообщений: 1,091
Записей в блоге: 2
06.08.2014, 19:13  [ТС] #3
Да любой. Например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//base.h
class base {
protected:
   static const float a;
   static const float b;
public:
   base();
   void foo();
};
 
//base.cpp
const float base::a = 3.;
const float base::b = 3.;
base::base(){};
void base::foo(){printf("base:%f,%f\n",a,b);};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//delivered.h
class delivered: 
   virtual public base{
protected:
   static const float b;
public:
   delivered();
   void bar();
};
 
//delivered.cpp
const float delivered::b = 3.1415926535;
delivered::delivered(){};
void delivered::bar(){printf("delivered:%f,%f\n",a,b);};
C++
1
2
3
4
5
6
void main(){
base b;
delivered d;
b.foo();
d.foo();
d.bar();}
C++
1
2
3
base:3,3
base:3,3
delivered:3,3.1415926535
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
06.08.2014, 19:33 #4
Цитата Сообщение от icpu Посмотреть сообщение
Как можно переопределить эти члены так, чтобы изменения подхватывали базовые методы?
Это не переопределение, а сокрытие. Т.е это разные переменные. В твоем примере по base::b будет доступна переменная со значением 3 из базового класса.
Есть пара извращений, которые можно предложить, чтобы решить вопрос примерно так, как ты хочешь. Но лучше расскажи какую задачу решаешь, наверняка есть способ прямее и лучше, чем вот это.
RussBear
1 / 1 / 1
Регистрация: 06.08.2014
Сообщений: 77
06.08.2014, 19:45 #5
icpu, я стесняюсь спросить, а Вы этот пример сами придумали? И для чего Вам это нужно.
Цитата Сообщение от icpu Посмотреть сообщение
protected:
* *static const float a;
* *static const float b;
Это вообще что? Я сильно сомневаюсь что компилятор пропустит неинициализированную константу. Вроде как ее при объявлении нужно инициализировать.
Цитата Сообщение от icpu Посмотреть сообщение
void delivered::bar(){printf("delivered:%f,%f\n",a,b);};
И определитесь пожалуйста с языком: для чего в С++ использовать чисто сишные функции?
чем Вас не устраивает
C++
1
std::cout << "чего то там " << a << b << "\n";
DrOffset
06.08.2014, 19:53
  #6

Не по теме:

Цитата Сообщение от RussBear Посмотреть сообщение
И определитесь пожалуйста с языком: для чего в С++ использовать чисто сишные функции?
Да ладно к printf-то придираться
Вот если например написать
C++
1
2
#include <cstdio>
std::printf("%s", ".......");
то это будет уже легально С++.

RussBear
06.08.2014, 20:01
  #7

Не по теме:

DrOffset, ну согласитесь что особого смысла в использовании printf() нет, но это к сути вопроса отношения не имеет, я вот все пытаюсь понять чего автор хочет добиться. Кто бы просветил...
Если это сделано для изучения полиморфизма, то это очень неудачный пример

DrOffset
06.08.2014, 20:11
  #8

Не по теме:

Цитата Сообщение от RussBear Посмотреть сообщение
ну согласитесь что особого смысла в использовании printf() нет
Учитывая, что это наверняка накиданный прямо в браузере пример, то смысла обращать на это внимания нет. Да и printf - на самом деле отличное средство, быстрое, форматирование, опять же, удобное. Только вот небезопасное с точки зрения типов. И это его единственный недостаток по большому счету. Не то, чтобы я сейчас говорю, что нужно смешивать С и С++ - нет, но и однозначно говорить, что функциям такого рода нет места в С++ коде никогда, я бы не стал.

icpu
323 / 228 / 43
Регистрация: 10.03.2011
Сообщений: 1,091
Записей в блоге: 2
06.08.2014, 20:11  [ТС] #9
DrOffset, я знаю, что это сокрытие. И что доступ к базовым членам осуществляется через, например, base::a.

В том то и проблема, что мне дан уже готовый класс с собраной в либу реализацией. Класс - решатель одной узкой задачи, веса решателя вшиты в виде статических констант. Переписывать всю реализацию из-за трёх констант и пяти функций просто лень. Я уже, даже, об изменении кода библиотеки подумывал, но опять же...
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
06.08.2014, 20:18 #10
Цитата Сообщение от icpu Посмотреть сообщение
В том то и проблема, что мне дан уже готовый класс с собраной в либу реализацией. Класс - решатель одной узкой задачи, веса решателя вшиты в виде статических констант.
То есть нужно подменить реализацию констант в базовом классе, чтобы, опять же, функции базового класса, смогли использовать эти другие значения констант в своих расчетах, но сделать это только для конкретного наследника? Если так, то я скажу, что без хаков это невозможно.

Добавлено через 1 минуту
Причем я даже больше скажу. Компилятор внутри либы мог вполне встроить эти значения по месту во всех используемых местах и тогда даже с хаками ничего сделать нельзя будет.
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
06.08.2014, 20:19 #11
Лучше проведи рефакторинг библиотеки, это чуть больше времени. Зато потом тебе спасибо скажут.
icpu
323 / 228 / 43
Регистрация: 10.03.2011
Сообщений: 1,091
Записей в блоге: 2
06.08.2014, 20:28  [ТС] #12
DrOffset, код либы бы дали сначала. В общем, ясно, дело труба.

RussBear, то-то и оно, что я не бездумно писал.
инциализация константного члена класса
C++
1
2
3
4
5
6
7
8
9
//h
class c{
const float a;
/*...*/};
 
//cpp
c::c():
   a(3.14)
{/*...*/};
инциализация статического члена класса
C++
1
2
3
4
5
6
7
8
//h
class c{
static float a;
/*...*/};
 
//cpp
float c::a = 3.14;
{/*...*/};
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
06.08.2014, 20:38 #13
Цитата Сообщение от icpu Посмотреть сообщение
DrOffset, код либы бы дали сначала
Кривой дизайн класса в либе налицо. Коэффициента a и b должны были быть псевдоконстантными значениями, с возможностью передачи кастомных значений через параметры конструктора:
C++
1
2
3
4
5
6
7
class Base
{
    const float a;
    const float b;
public:
    Base(float a = 3, float b = 3) : a(a), b(b) {}
};
Тогда для наследника можно было бы задать свои коэффициенты и все бы разрешилось.
А в этом случае со статическими константами, даю 99.9%, что компилятор их встроил прямо в вызовы во всех алгоритмах либы. Формально (если они в привате), он мог вообще не выделять память под них. Так что, действительно, труба.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.08.2014, 21:54 #14
Цитата Сообщение от DrOffset Посмотреть сообщение
Формально (если они в привате), он мог вообще не выделять память под них.
А причем тут private? Может где-то адрес берется от этой переменной, тогда память нужна по-любому.
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
06.08.2014, 22:28 #15
Цитата Сообщение от Tulosba Посмотреть сообщение
А причем тут private? Может где-то адрес берется от этой переменной, тогда память нужна по-любому.
А я где-то утверждал, что он 100% ее выкинул? Там как бы слово "мог" использовалось.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2014, 22:28
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.08.2014, 22:28
Ответ Создать тему
Опции темы

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