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

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

31.07.2015, 23:58. Показов 10187. Ответов 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
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
01.08.2015, 20:56
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от irises Посмотреть сообщение
это такое задание
Начните с разработки меню. А там что, предполагается какая-то имитация работы в реальном времени?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 21:16
Цитата Сообщение от hoggy Посмотреть сообщение
забудьте на минуту слово "алгоритм".
оно вам только глаз замыливает.
Ну глупо отрывать от контекста.
Цитата Сообщение от hoggy Посмотреть сообщение
это можно сделать, дернув напрямую функцию-член.
или дернув итератор.
Вопрос в том накой мне итератор когда есть "обычный" доступ?
Ответ- нафиг сдался, итератор нужен алгоритмам как способ обобщения.


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

Не по теме:


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

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

0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
01.08.2015, 21:21
Цитата Сообщение от hoggy Посмотреть сообщение
2.
в примере выше у класса был закрыт конструктор.
автор этого кода сделал это специально.
Цель была запретить создание объекта из-вне, но не запрещать наследоваться - разница все же очевидна не так ли ? Решение проблемы protected конструкторы - из-вне мы их так же не сможем вызвать, зато наследоваться сможем
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.08.2015, 21:29
Цитата Сообщение от smartpointer Посмотреть сообщение
но не запрещать наследоваться - разница все же очевидна не так ли ?
вы ошибаетесь.
запрет и на наследование тоже.

иначе конструктор был бы protected, а не private.
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
01.08.2015, 21:47
Цитата Сообщение от hoggy Посмотреть сообщение
вы ошибаетесь.
запрет и на наследование тоже.
Да ну, а если мне важно от него унаследоваться ? Допустим этот класс библиотечный, может юзер сам решит наследоваться от него или нет ?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.08.2015, 21:59
Цитата Сообщение от 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 Посмотреть сообщение
Да ну, а если мне важно от него унаследоваться ? Допустим этот класс библиотечный, может юзер сам решит наследоваться от него или нет ?
проблемы индейцев шерифа не колышат.

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

Avazart, цитата Страуструпа из книги:
За прошедшие годы было много предложений о том, как предоставить доступ к единице меньшей, чем целый класс. Например grant X::f(int) access to Y::a, Y::b, and Y::g(char). Мне не нравились все эти предложения, потому что более скрупулезный контроль не дает никакой дополнительной защиты. Любая функция-член может модифицировать любой член-данные класса, поэтому функция, которой предоставлен доступ к функции-члену, может косвенно модифицировать любой член. Я считал и считаю, что усложнение спецификации, реализации и использования не перевешивает преимуществ более явного контроля доступа.
3
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2015, 23:44
Цитата Сообщение от ct0r Посмотреть сообщение
Любая функция-член может модифицировать любой член-данные класса, поэтому функция, которой предоставлен доступ к функции-члену, может косвенно модифицировать любой член
Честно я говоря я не понял о чем он. Каким образом?
Если права даются на конкретный член(ы) данных, то почему он говорит "любой" и "косвенно".
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
02.08.2015, 00:14
Цитата Сообщение от Avazart Посмотреть сообщение
Честно я говоря я не понял о чем он. Каким образом?
Если права даются на конкретный член(ы) данных, то почему он говорит "любой" и "косвенно".
У нас есть класс и его функция-друг. Мы даем права функции-другу на вызов только какой-то одной функции-члена класса. Но эта функция-член класса имеет доступ ко всем данным класса и может их изменять. Поэтому исходная функция-друг может таким образом косвенно изменить любые данные класса. Так не проще ли не заморачиваться и изначально ей все позволить?

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

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

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

Но мне мой код все равно не нравится хоть с менежером связей хоть без.
Тут только три объекта, а что когда их будет значительно больше и связи будут нести более сложный характер?
Вероятно с этим можно только смирится.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
02.08.2015, 01:34
Цитата Сообщение от Avazart Посмотреть сообщение
Я делал так изначально, но если учесть что будет еще код к примеру для переривоки итп... получается захламление.
А куда ты собираешься вставлять код перерисовки? Внутрь графа? Тогда у нас логика отрисовки смешается с логикой АТД. Лучше по возможности этого избежать и сделать отрисовку полностью во внешнем коде, например через events.

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

Цитата Сообщение от Avazart Посмотреть сообщение
Ну так это суть сильносвязных объектов, тут априори иначе нельзя ибо модель разваливается.
Как к примеру может сущестовать дуга без вершин? Кроме того удаление ребра должно "оповещать" вершину о своем удалении.
Технически вполне можно реализовать их физическую независимость. И я все-таки считаю, что оповещать нужно граф, потому что связи - это его зона ответственности.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.08.2015, 02:01
Цитата Сообщение от ct0r Посмотреть сообщение
Технически вполне можно реализовать их физическую независимость.
Например?
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
02.08.2015, 03:27
Цитата Сообщение от Avazart Посмотреть сообщение
Например?
В каждом из них не пользоваться тем, для чего нужно знать полный тип другого.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.08.2015, 11:49
Цитата Сообщение от ct0r Посмотреть сообщение
В каждом из них не пользоваться тем, для чего нужно знать полный тип другого.
Пример кодом я имел ввиду. Как бы я свою реализацию примел, поэтому думаю суть понятна.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.08.2015, 12:38
Цитата Сообщение от ct0r Посмотреть сообщение
Технически вполне можно реализовать их физическую независимость. И я все-таки считаю, что оповещать нужно граф, потому что связи - это его зона ответственности.
Цитата Сообщение от ct0r Посмотреть сообщение
В каждом из них не пользоваться тем, для чего нужно знать полный тип другого.
имхо, не получится.

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

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

точнее, если по-извращаться,
то может быть, что нибудь и получится.
но код проще точно не станет.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
02.08.2015, 15:37
Цитата Сообщение от 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).
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.08.2015, 15:51
Вероятно имеется ввиду виртуальное наследование.

Добавлено через 51 секунду
Цитата Сообщение от gru74ik Посмотреть сообщение
Ну и Страуструп, собственно:
А в оригинале?
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
02.08.2015, 22:22
Цитата Сообщение от 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).
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.08.2015, 22:30
Фиг его знает чего они употребляют такое сочетание слов, подрузомевается вероятно
C++
1
2
3
class Bar : public virtual Foo
{
};
а тут слово виртуальный имеет отношение не столько к классу сколько к способу наследования.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
03.08.2015, 14:47
Цитата Сообщение от Avazart Посмотреть сообщение
Пример кодом я имел ввиду. Как бы я свою реализацию примел, поэтому думаю суть понятна.
Может позже напишу.

Цитата Сообщение от hoggy Посмотреть сообщение
их не получится изолировать от особенностей друг друга.
А разве у вершин и ребер должна быть какая-то связанная логика, помимо обычного хранения данных? Мне кажется, что всей логикой должен заниматься граф.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.08.2015, 14:47

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

Метод абстрактного класса не видит переменные дочернего класса
есть 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;); ...


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

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru