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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
irises
69 / 26 / 8
Регистрация: 29.06.2015
Сообщений: 105
#1

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

31.07.2015, 23:58. Просмотров 2871. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2015, 23:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как обратится к обьекту класса, являющегося наследником абстрактного класса (C++):

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

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

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

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

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

Использование конструктора базового класса наследником - C++
Доброго дня, коллеги! Решал одну задачку и столкнулся с проблемой. По условию дан класс String, моделирующий работу типа данных string....

131
Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 127
01.08.2015, 02:08 #31
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Напишите класс Дробь у которого открты поля знаменатель и числитель, и дайте друзьям "поиграться" и засекайте за сколько минут у них кританёт и они напишут, что ваш код гавно после кода
Нет ума - нефиг лезть. Проверки имеются для таких случаев. Кто сказал, что они смогут с ними поиграться, если они будут protected? В случае необходимости проверки, автоматически требуется метод.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,048
Записей в блоге: 17
01.08.2015, 02:11 #32
Eraston, Тебе намекают что проверка может быть в сетторе и тогда уже не поиграешься.
0
smartpointer
68 / 62 / 24
Регистрация: 17.02.2014
Сообщений: 262
01.08.2015, 02:19 #33
Лишнее движение - обращаться по адресу функции, чтобы получить переменную, когда ее можно получить напрямую - только для унаследованных детей. Писать 20 геттеров это вообще лол. Давайте уж тогда правильнее будем писать не один геттер, а два - итого 60 методов для 20 переменных (допустим, что хочу пользоваться всеми).
C++
1
2
inline const int& Get()const{return my_int;}
inline int& Get(){return my_int;}
Иногда можно отступить от правил, и не доходить до бреда и мазохизма, и быдлокодом тут даже не пахнет.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,048
Записей в блоге: 17
01.08.2015, 02:29 #34
smartpointer, Почитайте про inline может поймете в чем заблуждаетесь.

Добавлено через 3 минуты
Цитата Сообщение от smartpointer Посмотреть сообщение
допустим, что хочу пользоваться всеми).
Вопрос зачем, если для получения значения достаточно одного??

Добавлено через 2 минуты
Цитата Сообщение от smartpointer Посмотреть сообщение
Иногда можно отступить от правил, и не доходить до бреда и мазохизма, и быдлокодом тут даже не пахнет.
Может вспомнить что прввила не прото так придумали? Это тшательность и даьновидность, а не бред. А вот делать вопреки тут - ленью попахивает.
0
smartpointer
68 / 62 / 24
Регистрация: 17.02.2014
Сообщений: 262
01.08.2015, 02:37 #35
Цитата Сообщение от Avazart Посмотреть сообщение
Почитайте про inline может поймете в чем заблуждаетесь.
Я в курсе про инлайн, упор именно на то, зачем расширять интерфейс класса, когда можно взять значение напрямую(сама функция тоже хранится по адресу и занимает память).
Цитата Сообщение от Avazart Посмотреть сообщение
Вопрос зачем, если для получения значения достаточно одного??
Мда вот тут я попался, действительно тогда и сеттер не нужен, если возращать не по константной ссылке.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,048
Записей в блоге: 17
01.08.2015, 02:47 #36
Цитата Сообщение от smartpointer Посмотреть сообщение
сама функция тоже хранится по адресу и занимает память
Ну так выравнивание тоже занимает память... и че?

Добавлено через 2 минуты
Цитата Сообщение от smartpointer Посмотреть сообщение
inline int& Get(){return my_int;}
Ну это по сути и есть сеттер.

Добавлено через 1 минуту
Цитата Сообщение от smartpointer Посмотреть сообщение
зачем расширять интерфейс класса
Не расширять, а поддерживать его. Интерфейс как раз- методы, а не данные.

Добавлено через 42 секунды
Цитата Сообщение от smartpointer Посмотреть сообщение
когда можно взять значение напрямую(
Потому что это будет напрямую, а не косвенно.

Кода в иерархии два уровня все кажется простым, но когда больше и кода ваши классы пытается использовать кто-то другой вы даете ему возможность ошибиться.
0
smartpointer
01.08.2015, 02:50
  #37

Не по теме:


Цитата Сообщение от Avazart Посмотреть сообщение
Ну так выравнивание тоже занимает память... и че?
Кому очень надо воспользуются #pragmа pack. Что он там еще пишет ? Может напишем ему(он там вроде в комитете по стандартам засидает) пускай выпиливает protected и friend-ы - ибо инкапсуляция превыше всего !?

0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,048
Записей в блоге: 17
01.08.2015, 02:54 #38
Цитата Сообщение от smartpointer Посмотреть сообщение
Кому очень надо воспользуются #pragmа pack.
Ну ну ... может покинете ветку С++? К примеру свалите в Си и будете говорить какой хороший Асм ?

Про protected я уже написал он "для методов".
friend стоит использовать осторожно, в данном случае он ни к чему.
0
smartpointer
68 / 62 / 24
Регистрация: 17.02.2014
Сообщений: 262
01.08.2015, 03:01 #39
Цитата Сообщение от Avazart Посмотреть сообщение
Ну ну ... может покинете ветку С++? К примеру свалите в Си и будете говорить какой хороший Асм ?
Что за ненависть к сишникам ? Асм не знаю - честно
Цитата Сообщение от Avazart Посмотреть сообщение
Про protected я уже написал он "для методов". friend стоит использовать в "крайних" случаях.
Работаю с библиотекой где активно используются float,bool и прочее как protected - конкурент QT, быдлокодеры ?
Про friend-ы интересно - расскажите (ну или ссылку на крайняк)?
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,048
Записей в блоге: 17
01.08.2015, 03:17 #40
Цитата Сообщение от smartpointer Посмотреть сообщение
Что за ненависть к сишникам ? Асм не знаю - честно
А откуда страсть нарушать инкапсуляцию мотивируя расходом памяти?

Добавлено через 3 минуты
Цитата Сообщение от smartpointer Посмотреть сообщение
Про friend-ы интересно - расскажите (ну или ссылку на крайняк)?
А что расказывать friend нарушает инкапсуляцию... что-то новое? Из чего применять его следует только кода иначе просто нельзя.
К примеру, если нужно запретить создавать объекты напрямую через конструкторы.

Добавлено через 8 минут
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
57
58
59
60
61
62
63
64
65
66
class CarGasStation : public AbstractGasStation
{ 
   friend class ChainOfGasStation;
   protected:
       CarGasStation(){/**/};
  // твой код
};
 
class TruckGasStation : public AbstractGasStation
{
   friend class ChainOfGasStation;
   protected:
     TruckGasStation(){/**/};
  // твой код
};
 
class ChainOfGasStation
{
  public:
     ChainOfGasStation ();
    ~ChainOfGasStation ()
     {  
       clear();
     };
 
    void clear()
   {
       for(size_t i=0;i<station_.size();++i) 
          delete station_[i]; 
       stations_.clear();
   }
 
    AbstractGasStation*  addCarGasStation()
    { 
        AbstractGasStation*  station= new CarGasStation;
        stations_.push_back(station);   
        return station;    
    }  
 
    AbstractGasStation*  addTruckGasStation()
    { 
        AbstractGasStation*  station= new TruckGasStation;
        stations_.push_back(station);   
        return 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.addCarGasStation();
сhain.addTruckGasStation();
 
// TruckGasStation*  truckStation= new TruckGasStation; // Ошибка.
3
smartpointer
68 / 62 / 24
Регистрация: 17.02.2014
Сообщений: 262
01.08.2015, 03:18 #41
Цитата Сообщение от Avazart Посмотреть сообщение
А откуда страсть нарушать инкапсуляцию?
В пределах protected не считаю нарушением, мы даем доступ не кому попало а только тому, кому нужно, и особо не заостряю внимание на правильности, только потому, что кто-то описал что так нельзя делать (на заборе тоже написано)
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,048
Записей в блоге: 17
01.08.2015, 03:27 #42
Цитата Сообщение от smartpointer Посмотреть сообщение
, мы даем доступ не кому попало а только тому, кому нужно
Вобщето кому попало, ибо- всем наследникам (если конечно вы не собираетесь их потом "скрывать", все 20 штук в каждом наследники "первого уровня")
... хорошо если их всего один уровень, а если больше?

Добавлено через 2 минуты
Цитата Сообщение от smartpointer Посмотреть сообщение
и особо не заостряю внимание на правильности, только потому, что кто-то описал что так нельзя делать (на заборе тоже написано)
В данном случае нет веских оснований что бы делать через protected.
0
smartpointer
68 / 62 / 24
Регистрация: 17.02.2014
Сообщений: 262
01.08.2015, 03:36 #43
Цитата Сообщение от Avazart Посмотреть сообщение
Вобщето кому попало, ибо- всем наследникам (если конечно вы не собираетесь их потом "скрывать", все 20 штук в каждом наследники "первого уровня")
... хорошо если их всего один уровень, а если больше?
Вы считаете это косяк программиста или недоработка языка ?
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,048
Записей в блоге: 17
01.08.2015, 03:57 #44
Цитата Сообщение от smartpointer Посмотреть сообщение
Вы считаете это косяк программиста или недоработка языка ?
А вы как думаете зачем правила?

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
class A
{
   public:
      virtual int value()const{ return v_; };
   protected:
       int v_;
};
 
class B: public A  // *1000
{
   public:
      virtual int value()const{ return v_*1000; };
};
 
 
class C: public B  // еще раз на 1000
{
   public:
     virtual int value()const{ return v_*1000; }; /* Упс, это то что нам надо?!!! */
     //  или возможно хотели это:
     //  virtual  int value()const{ return B::value()*1000; }; 
     //  Логика: 
     //      мы наследуем поведения А или все же B?
};
Добавлено через 16 минут
Ну и с закрытием как вариант с разруливание проблемы

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
class A
{
   public:
      virtual int value()const{ return v_; };
   protected:
       int v_;
};
 
class B: public A  // *1000
{
   public:
      virtual int value()const{ return v_*1000; };
   private:
      using A::v_; /*Решение?  Или все же может лучше сразу сеттеры/геттеры? */
};
 
class C: public B  // еще раз на 1000
{
   public:
     // virtual int value()const{ return v_*1000; }; /* Не позволено! v_  закрыт */
     //  или возможно хотели это:
     virtual  int value()const{ return B::value()*1000; }; 
     //  Логика: 
     //      мы наследуем поведения А или все же B?
};
3
Eraston
53 / 10 / 2
Регистрация: 09.09.2014
Сообщений: 127
01.08.2015, 04:59 #45

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
А откуда страсть нарушать инкапсуляцию мотивируя расходом памяти?
Очень смахивает на сектантскую фразу



Добавлено через 27 минут
Цитата Сообщение от Avazart Посмотреть сообщение
или возможно хотели это:
* * *// *virtual *int value()const{ return B::value()*1000; };
* * *// *Логика:
* * *// * * *мы наследуем поведения А или все же B?
Неужели. Протрезвили. Если я правильно понимаю, при наследовании не-private-члена он создается в экзмепляре в количестве равном количеству наследований + 1 ( base > s1 > s2 - в s2 будет 3 экземпляра свойства X, что прямо противоречит не правилам инкапсуляции, а законам мироздания ). А private-члены создаются в единственном экземпляре в суперклассе. Чего нельзя сказать о методах ( если свойство одно, то методов работы с ним множество ), что обуславливает возможность сохранения их со всех предков и желаемый доступ, либо внутри класса, либо открытый, либо закрыть для следующих наследников ( типа устаревший для современности ). Если так, то с этого надо было начинать, а то: "инкапсуляция, инкапсуляция..."
0
01.08.2015, 04:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2015, 04:59
Привет! Вот еще темы с ответами:

Запрет shared_ptr быть наследником определённого класса - C++
Добрый день, #include &lt;memory&gt; class A { }; class B : public A {

Как при помощи указателя на базовый класс обратится к полю наследуемого класса? - C++
Всем привет! столкнулся с такой проблемой. У меня есть массив указателей на базовый виртуальный класс,и например я присваиваю указателю на...

как исправить Ошибка 8 error C2259: Tabl: невозможно создать экземпляр абстрактного класса - C++
имеется абстрактный класс, у нее есть 4 виртуальных функций: запись и чтение с помощью С и С++ имеется класс Tabl производный от...

Создание объекта класса, являющегося суммой 2ух других - C++
Нужно получить время на часах, сложив 2 другие временные отметки. Как я понимаю, нужно переопределить операцию сложения. Тогда как будет...


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

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

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