Форум программистов, компьютерный форум 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++ Как организовать интерфейс в виде абстрактного класса?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,670
01.08.2015, 20:56     Как обратится к обьекту класса, являющегося наследником абстрактного класса #101
Цитата Сообщение от irises Посмотреть сообщение
это такое задание
Начните с разработки меню. А там что, предполагается какая-то имитация работы в реальном времени?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
01.08.2015, 21:16     Как обратится к обьекту класса, являющегося наследником абстрактного класса #102
Цитата Сообщение от hoggy Посмотреть сообщение
забудьте на минуту слово "алгоритм".
оно вам только глаз замыливает.
Ну глупо отрывать от контекста.
Цитата Сообщение от hoggy Посмотреть сообщение
это можно сделать, дернув напрямую функцию-член.
или дернув итератор.
Вопрос в том накой мне итератор когда есть "обычный" доступ?
Ответ- нафиг сдался, итератор нужен алгоритмам как способ обобщения.


Цитата Сообщение от hoggy Посмотреть сообщение
в дизайне от этого ровным счетом вообще ничего не изменилось.
это два разных способа, которые делают одно и тоже действие.
Не одно и тоже, зачем нам выходить за область видимости класса?

Не по теме:


Добавлено через 12 минут

Цитата Сообщение от hoggy Посмотреть сообщение
так же как и создавались - через граф.
Ну не знаю. К примеру в Qt не так реализовано, там через delete, а методы removeXXX просто удаляют из внутренних списков, т.е передают владение.
Правда там нет запрета создания через коструктор.

smartpointer
 Аватар для smartpointer
64 / 58 / 23
Регистрация: 17.02.2014
Сообщений: 250
01.08.2015, 21:21     Как обратится к обьекту класса, являющегося наследником абстрактного класса #103
Цитата Сообщение от hoggy Посмотреть сообщение
2.
в примере выше у класса был закрыт конструктор.
автор этого кода сделал это специально.
Цель была запретить создание объекта из-вне, но не запрещать наследоваться - разница все же очевидна не так ли ? Решение проблемы protected конструкторы - из-вне мы их так же не сможем вызвать, зато наследоваться сможем
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
01.08.2015, 21:29     Как обратится к обьекту класса, являющегося наследником абстрактного класса #104
Цитата Сообщение от smartpointer Посмотреть сообщение
но не запрещать наследоваться - разница все же очевидна не так ли ?
вы ошибаетесь.
запрет и на наследование тоже.

иначе конструктор был бы protected, а не private.
smartpointer
 Аватар для smartpointer
64 / 58 / 23
Регистрация: 17.02.2014
Сообщений: 250
01.08.2015, 21:47     Как обратится к обьекту класса, являющегося наследником абстрактного класса #105
Цитата Сообщение от hoggy Посмотреть сообщение
вы ошибаетесь.
запрет и на наследование тоже.
Да ну, а если мне важно от него унаследоваться ? Допустим этот класс библиотечный, может юзер сам решит наследоваться от него или нет ?
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
01.08.2015, 21:59     Как обратится к обьекту класса, являющегося наследником абстрактного класса #106
Цитата Сообщение от Avazart Посмотреть сообщение
Вопрос в том накой мне итератор когда есть "обычный" доступ?
а это уже ваше личное дело.

Цитата Сообщение от Avazart Посмотреть сообщение
Ответ- нафиг сдался, итератор нужен алгоритмам как способ обобщения.
итератор сам по себе - паттерн,
смысл которого в возможности бегать по любым контейнерам,
не зависимо от их устройства.

но от этого конкретный итератор,
не перестает быть частью интерфейса контейнера.

Цитата Сообщение от Avazart Посмотреть сообщение
Не одно и тоже, зачем нам выходить за область видимости класса?
ну, мало ли?

у меня был случай,
когда нужно было сделать френдом глобальные функции std::make_shared,
и аналоги, например.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// обязан быть создан, 
// только как ресурс смартпоинтера
struct sample : std::enable_shared_from_this<sample>
{
    static std::shared_ptr<sample> make()
    {  
        // и вот здесь облом ...
        return  std::make_shared<sample>(); 
    }
 
    ... 
 
private:
    sample(){}
};
Цитата Сообщение от Avazart Посмотреть сообщение
Ну не знаю. К примеру в Qt не так реализовано, там через delete, а методы removeXXX просто удаляют из внутренних списков, т.е передают владение.
а вот это все и приводит к неоднозначностям в дизайне.

что бы пользоваться,
нужно знать и иметь ввиду все эти правила касательно владения.
и не забыть случайно чего-то там зачистить.

я когда то делал подобные вещи на смартпоинтерах.
можно было просто пользоваться и вообще не заморачиваться:
когда чего может подохнуть, и кто будет за всем подчищать.

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

если вы считаете, что можете нарушать контракты класса,
валяйте - есть куча разных способов, как его можно похакать.
по утери инварианта, класс вам больше ничего не гарантирует.
так что последствия полностью на вашей совести.
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
01.08.2015, 23:19     Как обратится к обьекту класса, являющегося наследником абстрактного класса #107
Если мы не поленимся и откроем книжку (Дизайн и Эволюция С++), то увидим, какова концепция защиты в С++.
1) Защита проверяется во время компиляции и направлена против случайных, а не преднамеренных или явных попыток ее преодоления.
2) Доступ предоставляется классом.
3) Контроль прав доступа выполняется для имен и не зависит от типа именованной сущности.
4) Единицей защиты является класс, а не отдельный объект.
5) Контролируется доступ, а не видимость.

Avazart, цитата Страуструпа из книги:
За прошедшие годы было много предложений о том, как предоставить доступ к единице меньшей, чем целый класс. Например grant X::f(int) access to Y::a, Y::b, and Y::g(char). Мне не нравились все эти предложения, потому что более скрупулезный контроль не дает никакой дополнительной защиты. Любая функция-член может модифицировать любой член-данные класса, поэтому функция, которой предоставлен доступ к функции-члену, может косвенно модифицировать любой член. Я считал и считаю, что усложнение спецификации, реализации и использования не перевешивает преимуществ более явного контроля доступа.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
01.08.2015, 23:44     Как обратится к обьекту класса, являющегося наследником абстрактного класса #108
Цитата Сообщение от ct0r Посмотреть сообщение
Любая функция-член может модифицировать любой член-данные класса, поэтому функция, которой предоставлен доступ к функции-члену, может косвенно модифицировать любой член
Честно я говоря я не понял о чем он. Каким образом?
Если права даются на конкретный член(ы) данных, то почему он говорит "любой" и "косвенно".
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
02.08.2015, 00:14     Как обратится к обьекту класса, являющегося наследником абстрактного класса #109
Цитата Сообщение от Avazart Посмотреть сообщение
Честно я говоря я не понял о чем он. Каким образом?
Если права даются на конкретный член(ы) данных, то почему он говорит "любой" и "косвенно".
У нас есть класс и его функция-друг. Мы даем права функции-другу на вызов только какой-то одной функции-члена класса. Но эта функция-член класса имеет доступ ко всем данным класса и может их изменять. Поэтому исходная функция-друг может таким образом косвенно изменить любые данные класса. Так не проще ли не заморачиваться и изначально ей все позволить?

Добавлено через 17 минут
Avazart, по поводу кода - это действительно пример того, как можно адекватно использовать friend. Но по моему мнению, там класс DependencyManager - лишний. Все это может делаться классом Graph. И еще: более низкоуровневые компоненты не должны как-то обращаться или зависеть от вышестоящих (дуги и вершины от графа или от этого менеджера зависимостей). Это более логично + тогда мы еще получим например профит в том, что при правке дуг нам не придется пересобирать и вершину, а при правке вершины - дугу. Сейчас же будет пересобираться абсолютно все.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
02.08.2015, 01:14     Как обратится к обьекту класса, являющегося наследником абстрактного класса #110
Цитата Сообщение от ct0r Посмотреть сообщение
У нас есть класс и его функция-друг. Мы даем права функции-другу на вызов только какой-то одной функции-члена класса. Но эта функция-член класса имеет доступ ко всем данным класса и может их изменять. Поэтому исходная функция-друг может таким образом косвенно изменить любые данные класса. Так не проще ли не заморачиваться и изначально ей все позволить?
Да суть понятна, хотя речь там вроде была про членны данные.
Одно дело позволять все, а другое дело позволять все, но через оговоренный метод(интерфейс).

Цитата Сообщение от ct0r Посмотреть сообщение
Но по моему мнению, там класс DependencyManager - лишний
Цитата Сообщение от ct0r Посмотреть сообщение
Но по моему мнению, там класс DependencyManager - лишний. Все это может делаться классом Graph.
Я делал так изначально, но если учесть что будет еще код к примеру для переривоки итп... получается захламление.
А так задача "связей" выделена в отдельный объект и Graph не нагружен задачей поддержки связей.

Цитата Сообщение от ct0r Посмотреть сообщение
И еще: более низкоуровневые компоненты не должны как-то обращаться или зависеть от вышестоящих
Ну так это суть сильносвязных объектов, тут априори иначе нельзя ибо модель разваливается.
Как к примеру может сущестовать дуга без вершин? Кроме того удаление ребра должно "оповещать" вершину о своем удалении.

Но мне мой код все равно не нравится хоть с менежером связей хоть без.
Тут только три объекта, а что когда их будет значительно больше и связи будут нести более сложный характер?
Вероятно с этим можно только смирится.
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
02.08.2015, 01:34     Как обратится к обьекту класса, являющегося наследником абстрактного класса #111
Цитата Сообщение от Avazart Посмотреть сообщение
Я делал так изначально, но если учесть что будет еще код к примеру для переривоки итп... получается захламление.
А куда ты собираешься вставлять код перерисовки? Внутрь графа? Тогда у нас логика отрисовки смешается с логикой АТД. Лучше по возможности этого избежать и сделать отрисовку полностью во внешнем коде, например через events.

Цитата Сообщение от Avazart Посмотреть сообщение
А так задача "связей" выделена в отдельный объект и Graph не нагружен задачей поддержки связей.
Так Graph и должен заниматься связями. Ведь что такое граф? Это множество связанных дугами вершин. Но больше никакими связями он заниматься не должен.

Цитата Сообщение от Avazart Посмотреть сообщение
Ну так это суть сильносвязных объектов, тут априори иначе нельзя ибо модель разваливается.
Как к примеру может сущестовать дуга без вершин? Кроме того удаление ребра должно "оповещать" вершину о своем удалении.
Технически вполне можно реализовать их физическую независимость. И я все-таки считаю, что оповещать нужно граф, потому что связи - это его зона ответственности.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
02.08.2015, 02:01     Как обратится к обьекту класса, являющегося наследником абстрактного класса #112
Цитата Сообщение от ct0r Посмотреть сообщение
Технически вполне можно реализовать их физическую независимость.
Например?
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
02.08.2015, 03:27     Как обратится к обьекту класса, являющегося наследником абстрактного класса #113
Цитата Сообщение от Avazart Посмотреть сообщение
Например?
В каждом из них не пользоваться тем, для чего нужно знать полный тип другого.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
02.08.2015, 11:49     Как обратится к обьекту класса, являющегося наследником абстрактного класса #114
Цитата Сообщение от ct0r Посмотреть сообщение
В каждом из них не пользоваться тем, для чего нужно знать полный тип другого.
Пример кодом я имел ввиду. Как бы я свою реализацию примел, поэтому думаю суть понятна.
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
02.08.2015, 12:38     Как обратится к обьекту класса, являющегося наследником абстрактного класса #115
Цитата Сообщение от ct0r Посмотреть сообщение
Технически вполне можно реализовать их физическую независимость. И я все-таки считаю, что оповещать нужно граф, потому что связи - это его зона ответственности.
Цитата Сообщение от ct0r Посмотреть сообщение
В каждом из них не пользоваться тем, для чего нужно знать полный тип другого.
имхо, не получится.

такова описываемая предметная область:
сетка взаимосвязанных элементов.

их не получится изолировать от особенностей друг друга.

точнее, если по-извращаться,
то может быть, что нибудь и получится.
но код проще точно не станет.
gru74ik
Модератор
 Аватар для gru74ik
3121 / 1347 / 167
Регистрация: 20.02.2013
Сообщений: 3,852
Записей в блоге: 17
02.08.2015, 15:37     Как обратится к обьекту класса, являющегося наследником абстрактного класса #116
Цитата Сообщение от Avazart Посмотреть сообщение
Цитата Сообщение от irises Посмотреть сообщение
один виртуальный
Нет таких классов в С++. Может абстрактный или базовый?
Ну как же:
Цитата Сообщение от Stephen Prata
Except for the case of virtual base classes (see Chapter 14, “Reusing Code in C++”), a class can pass values back only to its immediate base class.
(Chapter 13, page 715)

В русском переводе:
Цитата Сообщение от Стивен Прата
За исключением случая виртуальных базовых классов (см. главу 14), класс может передавать значения только своему непосредственному базовому классу.
(Глава 13, стр. 667)

Добавлено через 21 минуту
Ну и Страуструп, собственно:
В случаях, когда базовый класс не должен быть представлен двумя раздельными
объектами, нужно использовать так называемые виртуальные базовые классы
(§15.2.4).
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
02.08.2015, 15:51     Как обратится к обьекту класса, являющегося наследником абстрактного класса #117
Вероятно имеется ввиду виртуальное наследование.

Добавлено через 51 секунду
Цитата Сообщение от gru74ik Посмотреть сообщение
Ну и Страуструп, собственно:
А в оригинале?
gru74ik
Модератор
 Аватар для gru74ik
3121 / 1347 / 167
Регистрация: 20.02.2013
Сообщений: 3,852
Записей в блоге: 17
02.08.2015, 22:22     Как обратится к обьекту класса, являющегося наследником абстрактного класса #118
Цитата Сообщение от Avazart Посмотреть сообщение
А в оригинале?
В оригинале:
Цитата Сообщение от Bjarne Stroustrup
These may be classes intended to allow a designer or programmer to pick and choose among desirable attributes for later-designed classes by specifying virtual base classes (§15.2.4).
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
02.08.2015, 22:30     Как обратится к обьекту класса, являющегося наследником абстрактного класса #119
Фиг его знает чего они употребляют такое сочетание слов, подрузомевается вероятно
C++
1
2
3
class Bar : public virtual Foo
{
};
а тут слово виртуальный имеет отношение не столько к классу сколько к способу наследования.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2015, 14:47     Как обратится к обьекту класса, являющегося наследником абстрактного класса
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
03.08.2015, 14:47     Как обратится к обьекту класса, являющегося наследником абстрактного класса #120
Цитата Сообщение от Avazart Посмотреть сообщение
Пример кодом я имел ввиду. Как бы я свою реализацию примел, поэтому думаю суть понятна.
Может позже напишу.

Цитата Сообщение от hoggy Посмотреть сообщение
их не получится изолировать от особенностей друг друга.
А разве у вершин и ребер должна быть какая-то связанная логика, помимо обычного хранения данных? Мне кажется, что всей логикой должен заниматься граф.
Yandex
Объявления
03.08.2015, 14:47     Как обратится к обьекту класса, являющегося наследником абстрактного класса
Ответ Создать тему
Опции темы

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