Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/37: Рейтинг темы: голосов - 37, средняя оценка - 4.97
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186

Как обратится к обьекту класса, являющегося наследником абстрактного класса

31.07.2015, 23:58. Показов 9156. Ответов 131
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
У меня есть 4 класса: один виртуальный, следующие 2 - наследуют виртуальный класс и последний класс содержит
указатель на виртуальный класс (динамический массив, который растет от методов buildCar и buildTruck).
eFuel - это также класс, который содержит еще класс, но в данном вопросе они не принимают участия.
Вопрос: как через указатель четвертого класса доступится к наследующим классам?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class aGasStation
{
    friend class bCar;
    friend class cTruck;
protected :
    double A92;
    double A95;
    double A98;
    int cistern92;
    int cistern95;
    int cistern98;
public:
    aGasStation ();
    ~aGasStation ();
    virtual void print () = 0;
};
 
class bCar : public aGasStation
{
    eFuel fuelcar;
public:
    bCar ();
    ~bCar ();
    void print ();
};
 
class cTruck  : public aGasStation
{
    eFuel fueltruck;
public:
    cTruck ();
    ~cTruck ();
    void print ();
};
 
class dChainOfGasStation
{
    aGasStation *base;
    double money;
    static int size;
public:
    dChainOfGasStation ();
    ~dChainOfGasStation ();
    friend void buildCar (dChainOfGasStation *tmp);
    friend void buildTruck (dChainOfGasStation *tmp);
};
C++
1
2
3
4
5
6
7
8
void main ()
{
    dChainOfGasStation base;
    buildCar (&base);
    buildCar (&base);
    buildTruck (&base);
    buildCar (&base);   
}
Пытаюсь таким способом в main(), но знаю что base[0] - это private, а сделать его public противоречит правилам С++
C++
1
base.base[0]->print();
Можно написать set-метод, но каким образом это сделать я не знаю.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.07.2015, 23:58
Ответы с готовыми решениями:

как узнать,является данный объект класса А1 наследником класса А2
Всем привет)есть классы S, A1, A2, B1, B2. Иерархия наследования следующая S - Является родителем для всех классов и он имеет...

Как полю класса А обратится к приватной функции класса А?
Есть лифт (класс "Elevator "), в котором находится кнопка (класс "Button"). При нажатии на кнопку (функция "push") должен пойти...

Как обратиться из конструктора базового абстрактного класса к свойству-массиву класса наследника
Добрый день. Подскажите как обратиться из конструктора базового абстрактного класса к свойству-массиву из класса наследника. Вроде бы...

131
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 00:02
Цитата Сообщение от irises Посмотреть сообщение
один виртуальный
Нет таких классов в С++. Может абстрактный или базовый?
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
01.08.2015, 00:07  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Нет таких классов в С++. Может абстрактный или базовый?
ошиблась с терминологией)
он одновременно есть и базовым для двух классов, и абстрактным, потому что все его методы будут равны нулю
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 00:09
C++
1
2
3
4
5
6
7
protected :
    double A92;
    double A95;
    double A98;
    int cistern92;
    int cistern95;
    int cistern98;
Членный класса всегда должны быть закрытыми, а не защищенными.

Добавлено через 2 минуты
C++
1
class bCar : public aGasStation
Открытое наследование подразумевате отношение "A является Б".
Автомобиль является заправкой? Где здравый смысл?
1
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
01.08.2015, 00:11  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Открытое наследование подразумевате отношение "A является Б".
Автомобиль является заправкой? Где здравый смысл?
такое задание, есть 2 вида заправок - для автомобилей и для грузовиков

Цитата Сообщение от Avazart Посмотреть сообщение
Членный класса всегда должны быть закрытыми, а не защищенными.
нам так показывали на занятиях, чтоб упростить наверно жизнь) к тому же защищенные поля буду видны только внутри классов
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 00:16
Ну так пишите соответствующее.
C++
1
class CarGasStation : public AbstractGasStation
Добавлено через 2 минуты
Цитата Сообщение от irises Посмотреть сообщение
нам так показывали на занятиях,
Покажите им в ответ палец....

Добавлено через 47 секунд
Цитата Сообщение от irises Посмотреть сообщение
к тому же защищенные поля буду видны только внутри классов
И внутри всех наследованных классов ... это не хорошо на самом деле....
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
01.08.2015, 00:17  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так пишите соответствующее.
C++
1
class CarGasStation : public AbstractGasStation
маленькие буквы в названиях класса - только для моего удобства, ведь в программе каждый класс находится в отдельном header и cpp -файлах, и чтоб не запутатся, сделала в алфавитном порядке
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 00:18
А что пытались сделать в dChainOfGasStation ?
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
01.08.2015, 00:19  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
И внутри всех наследованных классов ... это не хорошо на самом деле....
на самом деле я этого добивалась, чтоб не прописывать эти поля в каждом наследованном классе
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 00:19
Цитата Сообщение от irises Посмотреть сообщение
маленькие буквы в названиях класса - только для моего удобства, ведь в программе каждый класс находится в отдельном header и cpp -файлах, и чтоб не запутатся, сделала в алфавитном порядке
Чё? Какое еще удобство? Вы код для только себя пишете? Если да то ваш код и смотреть никто не будет...

Добавлено через 49 секунд
Цитата Сообщение от irises Посмотреть сообщение
на самом деле я этого добивалась, чтоб не прописывать эти поля в каждом наследованном классе
Для этого есть геттеры и сетторы.
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
01.08.2015, 00:23  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
А что пытались сделать в dChainOfGasStation ?
этот класс будет управлять сетью заправок, с помощью методов, которые показала выше - буду добавлять новые заправки
и вот через этот главный класс хочу организовать заправку машин и подачу бензина на заправку (тоесть уход и приход бензина) через абстрактный класс

Какое еще удобство? Вы код для только себя пишете? Если да то ваш код и смотреть никто не будет...
я только учусь и пытаюсь сложную программу сделать более простой для понимая - хотя бы для себя, чтоб привыкнуть ко всему, а со временем привыкну и буду писать как надо
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 00:26
Цитата Сообщение от Avazart Посмотреть сообщение
Для этого есть геттеры и сетторы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class aGasStation
{
public:
    aGasStation ();
    ~aGasStation ();
    virtual void print () = 0;
 
    // Доступ к A92_   через методы класса.
    void setA92(double a){ A92_ = a; }; // установить значение
    double getA92()const{  return A92_; } // получить значение
private:
    double A92_;
   //.... 
};
Добавлено через 2 минуты
Цитата Сообщение от irises Посмотреть сообщение
этот класс будет управлять сетью заправок, с помощью методов, которые показала выше - буду добавлять новые заправки
и вот через этот главный класс хочу организовать заправку машин и подачу бензина на заправку (тоесть уход и приход бензина) через абстрактный класс
Явно неправльно организовано.... и неоправданное использование friend.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
01.08.2015, 00:26
Цитата Сообщение от Avazart Посмотреть сообщение
Членный класса всегда должны быть закрытыми, а не защищенными.
странное утверждение
0
 Аватар для irises
140 / 72 / 26
Регистрация: 29.06.2015
Сообщений: 186
01.08.2015, 00:34  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Для этого есть геттеры и сетторы.
об этом я знаю
просто в конструкторах наследственных классов уже прописана цена и макс объем цистерн для бензина
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 00:45
Цитата Сообщение от irises Посмотреть сообщение
об этом я знаю
просто в конструкторах наследственных классов уже прописана цена и макс объем цистерн для бензина
Ну вот не нужно было это делать наверное. Ну или уже предусмотреть инициализацию величинами из базового класса.

Как то так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class AbstractGasStation
{ 
  public:
  /*Никаких друзей*/
   virtual ~AbstractGasStation(){}; /*Виртуальный деструктор*/
  // твой код
};
 
class CarGasStation : public AbstractGasStation
{
  // твой код
};
 
class TruckGasStation : public AbstractGasStation
{
  // твой код
};
 
class ChainOfGasStation
{
  public:
     ChainOfGasStation ();
    ~ChainOfGasStation ()
     {  
       clear();
     };
 
    void clear()
   {
       for(size_t i=0;i<station_.size();++i) 
          delete station_[i]; 
       stations_.clear();
   }
 
    void add(AbstractGasStation* station)
    { 
       stations_.push_back(station);   
    }  
 
    AbstractGasStation* station(size_t index)
    {
       return stations_.at(index);
    }
   
    size_t size() const
   {
      return station_.size();
   }
 
  private:
     std::vector<AbstractGasStation*> stations_; // Либо массив что усложнит задачу.
};
// ....
ChainOfGasStation  сhain;
сhain.add(new CarGasStation);
сhain.add(new TruckGasStation);
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
01.08.2015, 00:46
Цитата Сообщение от Avazart Посмотреть сообщение
Членный класса всегда должны быть закрытыми, а не защищенными.
Да что вы? А как вы их наследовать будете? Если мне память не изменяет, private-члены ни при каких условиях потомкам не переходят.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 00:56
Касательно инициализации через конструктор базового класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class AbstractGasStation
{ 
  public:
  /*Никаких друзей*/
   virtual ~AbstractGasStation(){}; /*Виртуальный деструктор!*/
   void AbstractGasStation(){};
   AbstractGasStation(double A92,double A95,double A98) // Конструктор с параметрами инициализирущими начальные значения.
    :A92_(A92), // Список инициализации
     A95_(A95)
     A98_(A98)
    {};
  // твой код
};
 
class CarGasStation : public AbstractGasStation
{
  public:
   CarGasStation():AbstractGasStation(10,20,30){};// Инициализируем используя конструктор базового класса.
  // твой код
};
 
class TruckGasStation : public AbstractGasStation
{
  public:
    TruckGasStation():AbstractGasStation(40,50,60){};
  // твой код
};
Но опять нужно смотреть задание, понимать что общее между этими двумя классами и чем они отличаются.
Что выносить в базовый класс(общее) а что нет, и вообще смысл всего этого.
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
01.08.2015, 00:56
Это, конечно, вопрос подхода.
Мне вот "очень удобно" внутри своих классов таким бредом маяться:
SetVar( GetVar + 8 );
вместо
Var += 8;
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 01:00
Цитата Сообщение от Eraston Посмотреть сообщение
Да что вы? А как вы их наследовать будете? Если мне память не изменяет, private-члены ни при каких условиях потомкам не переходят.
Они то "переходят" но они становятся "недоступными" для этого я и определили открытые методы-акцессоры.

Добавлено через 1 минуту
Цитата Сообщение от Eraston Посмотреть сообщение
Это, конечно, вопрос подхода.
Нет, это вопрос инкапсуляции.
К тому же акцессоры можно делать "ссылочными".
C++
1
obj.var()+= 8;
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
01.08.2015, 01:04
Цитата Сообщение от Avazart Посмотреть сообщение
Они то "переходят" но они становятся "недоступными" для этого я и определили открытые методы-акцессоры.
В классе 20 переменных, для каждой писать гетсеты? Хуже того - впоследствии, пользоваться ими? Учитывая, что protected-члены также недоступны вне классов, а в пределах класса они всё равно являются что private, что protected, с разницей в уровне удобства доступа...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.08.2015, 01:04
Помогаю со студенческими работами здесь

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

Метод абстрактного класса не видит переменные дочернего класса
есть abstract class A{ protected static $dir; public static function f(){} } и два класса B,C наследника { protected static...

Вызов функции класса, который наследуется от абстрактного класса
Предположим, что существует класс Base, который является абстрактным class Base{ public: virtual void something() = 0; virtual...

Как инициализировать члены класса, являющегося параметром шаблона
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; template &lt;typename SomeClass&gt; class Array { private : ...

Как обратится к объекту класса
Не могу обратится к объекту класса по индексу int main() { setlocale(LC_ALL, &quot;RUS&quot;); system(&quot;cls&quot;); ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru