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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
irises
 Аватар для irises
68 / 25 / 8
Регистрация: 29.06.2015
Сообщений: 101
31.07.2015, 23:58     Как обратится к обьекту класса, являющегося наследником абстрактного класса #1
Здравствуйте!
У меня есть 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-метод, но каким образом это сделать я не знаю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2015, 23:58     Как обратится к обьекту класса, являющегося наследником абстрактного класса
Посмотрите здесь:

Реализация абстрактного класса C++
как исправить Ошибка 8 error C2259: Tabl: невозможно создать экземпляр абстрактного класса C++
Создание объекта класса, являющегося суммой 2ух других C++
как узнать,является данный объект класса А1 наследником класса А2 C++
C++ Как организовать интерфейс в виде абстрактного класса?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
01.08.2015, 00:02     Как обратится к обьекту класса, являющегося наследником абстрактного класса #2
Цитата Сообщение от irises Посмотреть сообщение
один виртуальный
Нет таких классов в С++. Может абстрактный или базовый?
irises
 Аватар для irises
68 / 25 / 8
Регистрация: 29.06.2015
Сообщений: 101
01.08.2015, 00:07  [ТС]     Как обратится к обьекту класса, являющегося наследником абстрактного класса #3
Цитата Сообщение от Avazart Посмотреть сообщение
Нет таких классов в С++. Может абстрактный или базовый?
ошиблась с терминологией)
он одновременно есть и базовым для двух классов, и абстрактным, потому что все его методы будут равны нулю
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
01.08.2015, 00:09     Как обратится к обьекту класса, являющегося наследником абстрактного класса #4
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 является Б".
Автомобиль является заправкой? Где здравый смысл?
irises
 Аватар для irises
68 / 25 / 8
Регистрация: 29.06.2015
Сообщений: 101
01.08.2015, 00:11  [ТС]     Как обратится к обьекту класса, являющегося наследником абстрактного класса #5
Цитата Сообщение от Avazart Посмотреть сообщение
Открытое наследование подразумевате отношение "A является Б".
Автомобиль является заправкой? Где здравый смысл?
такое задание, есть 2 вида заправок - для автомобилей и для грузовиков

Цитата Сообщение от Avazart Посмотреть сообщение
Членный класса всегда должны быть закрытыми, а не защищенными.
нам так показывали на занятиях, чтоб упростить наверно жизнь) к тому же защищенные поля буду видны только внутри классов
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
01.08.2015, 00:16     Как обратится к обьекту класса, являющегося наследником абстрактного класса #6
Ну так пишите соответствующее.
C++
1
class CarGasStation : public AbstractGasStation
Добавлено через 2 минуты
Цитата Сообщение от irises Посмотреть сообщение
нам так показывали на занятиях,
Покажите им в ответ палец....

Добавлено через 47 секунд
Цитата Сообщение от irises Посмотреть сообщение
к тому же защищенные поля буду видны только внутри классов
И внутри всех наследованных классов ... это не хорошо на самом деле....
irises
 Аватар для irises
68 / 25 / 8
Регистрация: 29.06.2015
Сообщений: 101
01.08.2015, 00:17  [ТС]     Как обратится к обьекту класса, являющегося наследником абстрактного класса #7
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так пишите соответствующее.
C++
1
class CarGasStation : public AbstractGasStation
маленькие буквы в названиях класса - только для моего удобства, ведь в программе каждый класс находится в отдельном header и cpp -файлах, и чтоб не запутатся, сделала в алфавитном порядке
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
01.08.2015, 00:18     Как обратится к обьекту класса, являющегося наследником абстрактного класса #8
А что пытались сделать в dChainOfGasStation ?
irises
 Аватар для irises
68 / 25 / 8
Регистрация: 29.06.2015
Сообщений: 101
01.08.2015, 00:19  [ТС]     Как обратится к обьекту класса, являющегося наследником абстрактного класса #9
Цитата Сообщение от Avazart Посмотреть сообщение
И внутри всех наследованных классов ... это не хорошо на самом деле....
на самом деле я этого добивалась, чтоб не прописывать эти поля в каждом наследованном классе
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
01.08.2015, 00:19     Как обратится к обьекту класса, являющегося наследником абстрактного класса #10
Цитата Сообщение от irises Посмотреть сообщение
маленькие буквы в названиях класса - только для моего удобства, ведь в программе каждый класс находится в отдельном header и cpp -файлах, и чтоб не запутатся, сделала в алфавитном порядке
Чё? Какое еще удобство? Вы код для только себя пишете? Если да то ваш код и смотреть никто не будет...

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

Какое еще удобство? Вы код для только себя пишете? Если да то ваш код и смотреть никто не будет...
я только учусь и пытаюсь сложную программу сделать более простой для понимая - хотя бы для себя, чтоб привыкнуть ко всему, а со временем привыкну и буду писать как надо
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
01.08.2015, 00:26     Как обратится к обьекту класса, являющегося наследником абстрактного класса #12
Цитата Сообщение от 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.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,224
01.08.2015, 00:26     Как обратится к обьекту класса, являющегося наследником абстрактного класса #13
Цитата Сообщение от Avazart Посмотреть сообщение
Членный класса всегда должны быть закрытыми, а не защищенными.
странное утверждение
irises
 Аватар для irises
68 / 25 / 8
Регистрация: 29.06.2015
Сообщений: 101
01.08.2015, 00:34  [ТС]     Как обратится к обьекту класса, являющегося наследником абстрактного класса #14
Цитата Сообщение от Avazart Посмотреть сообщение
Для этого есть геттеры и сетторы.
об этом я знаю
просто в конструкторах наследственных классов уже прописана цена и макс объем цистерн для бензина
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
01.08.2015, 00:45     Как обратится к обьекту класса, являющегося наследником абстрактного класса #15
Цитата Сообщение от 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);
Eraston
 Аватар для Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 123
01.08.2015, 00:46     Как обратится к обьекту класса, являющегося наследником абстрактного класса #16
Цитата Сообщение от Avazart Посмотреть сообщение
Членный класса всегда должны быть закрытыми, а не защищенными.
Да что вы? А как вы их наследовать будете? Если мне память не изменяет, private-члены ни при каких условиях потомкам не переходят.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
01.08.2015, 00:56     Как обратится к обьекту класса, являющегося наследником абстрактного класса #17
Касательно инициализации через конструктор базового класса.
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){};
  // твой код
};
Но опять нужно смотреть задание, понимать что общее между этими двумя классами и чем они отличаются.
Что выносить в базовый класс(общее) а что нет, и вообще смысл всего этого.
Eraston
 Аватар для Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 123
01.08.2015, 00:56     Как обратится к обьекту класса, являющегося наследником абстрактного класса #18
Это, конечно, вопрос подхода.
Мне вот "очень удобно" внутри своих классов таким бредом маяться:
SetVar( GetVar + 8 );
вместо
Var += 8;
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
01.08.2015, 01:00     Как обратится к обьекту класса, являющегося наследником абстрактного класса #19
Цитата Сообщение от Eraston Посмотреть сообщение
Да что вы? А как вы их наследовать будете? Если мне память не изменяет, private-члены ни при каких условиях потомкам не переходят.
Они то "переходят" но они становятся "недоступными" для этого я и определили открытые методы-акцессоры.

Добавлено через 1 минуту
Цитата Сообщение от Eraston Посмотреть сообщение
Это, конечно, вопрос подхода.
Нет, это вопрос инкапсуляции.
К тому же акцессоры можно делать "ссылочными".
C++
1
obj.var()+= 8;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2015, 01:04     Как обратится к обьекту класса, являющегося наследником абстрактного класса
Еще ссылки по теме:

Как при помощи указателя на базовый класс обратится к полю наследуемого класса? C++
C++ Использование абстрактного класса
C++ Как полю класса А обратится к приватной функции класса А?

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

Или воспользуйтесь поиском по форуму:
Eraston
 Аватар для Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 123
01.08.2015, 01:04     Как обратится к обьекту класса, являющегося наследником абстрактного класса #20
Цитата Сообщение от Avazart Посмотреть сообщение
Они то "переходят" но они становятся "недоступными" для этого я и определили открытые методы-акцессоры.
В классе 20 переменных, для каждой писать гетсеты? Хуже того - впоследствии, пользоваться ими? Учитывая, что protected-члены также недоступны вне классов, а в пределах класса они всё равно являются что private, что protected, с разницей в уровне удобства доступа...
Yandex
Объявления
01.08.2015, 01:04     Как обратится к обьекту класса, являющегося наследником абстрактного класса
Ответ Создать тему
Опции темы

Текущее время: 11:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru