Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
14 / 14 / 10
Регистрация: 14.11.2012
Сообщений: 58

Доступ к методам производного класса

14.11.2012, 11:03. Показов 2813. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть базовый класс CJobGeneral. В нём описано несколько методов.
Есть унаследованный от него CJobCitomir с рядом своих методов.
Есть третий класс CGenPjct, в котором объявляется переменная класса CJobGeneral:
C++
1
static CJobGeneral* m_Job;
В классе CGenPjct есть функция, которая должна присвоить переменной m_Job объект либо класса CJobGeneral, либо CJobCitomir, в зависимости от переданного ей параметра:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int CGenPjct::Start(int typeOfProject/*=0*/)
{
    ...
 
    switch (typeOfProject)
    {
    case 0:
        m_Job = new CJobGeneral("JobCitomir.dll");
        break;
    case 1:
        m_Job =new CJobCitomir("JobCitomir.dll");
        break;
    default:
        m_Job = new CJobGeneral("JobCitomir.dll");
    }
 
    ...
 
    return 0;
}
Далее, в зависимости от приложения, которое будет использовать класс CGenPjct и передавать в метод Start свой идентификатор, по идее должны быть доступны те или иные методы в переменной m_Job.
Но косяк в том, что, эта часть:
C++
1
2
    case 1:
        m_Job =new CJobCitomir("JobCitomir.dll");
Позволяет использовать лишь методы базового класса, а методы производного не видит(error C2039: 'CreateNewScan' : is not a member of 'CJobGeneral')
.
Временно решил проблему путём описания в базовом классе методов производного как virtual:
C++
1
2
3
    virtual int CreateNewScan(){}
    virtual int ResetScan(){}
    virtual int PlayPauseScan(BOOL flag){}
Но число производных от CJobGeneral классов скоро будет как минимум 5 и у каждого свои методы. И описывать их в базовом, чувствую, что не правильно.

Вот и вопрос: можно ли(и как правильно) присвоить объект производного класса к переменной базового так, чтобы был доступ к методам производного был доступ без их описания как виртуальных в базовом?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.11.2012, 11:03
Ответы с готовыми решениями:

Как получить доступ к методам класса, который содержится в векторе класса
Пишу дерево с любым количеством наследников. В классе Thread содержится вектор классов Thread. При попытке просмотра первого элемента в...

Доступ функциям производного класса через базовый
В общем, я только изучаю С++ и не могу понять. Как можно получить доступ к функциям из объекта базового класса к функциям производного...

Доступ к методам класса без создания объекта
Почему доступны методы foo() и bar() класса А, если нет ни одного объекта это класса? #include <iostream> class A { ...

5
 Аватар для igorrr37
2872 / 2019 / 991
Регистрация: 21.12.2010
Сообщений: 3,754
Записей в блоге: 9
14.11.2012, 11:26
можно скастовать базовый указатель в производный указатель через dynamic_cast (вернёт 0 если каст неуспешен)(для работы dynamic_cast в базовом классе должен быть хоть один виртуальный метод)
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
14.11.2012, 11:30
Цитата Сообщение от hdnn Посмотреть сообщение
Вот и вопрос: можно ли(и как правильно) присвоить объект производного класса к переменной базового так, чтобы был доступ к методам производного был доступ без их описания как виртуальных в базовом?
Никак. Базовый класс - он на то и базовый, что объявляет общий интерфейс для всех наследников.

Попробуй "инвертировать" задачу. Мне кажется, здесь хорошо ляжет шаблон проектирования "посетитель" (Visitor).
0
14 / 14 / 10
Регистрация: 14.11.2012
Сообщений: 58
14.11.2012, 12:00  [ТС]
Цитата Сообщение от igorrr37 Посмотреть сообщение
можно скастовать базовый указатель в производный указатель через dynamic_cast (вернёт 0 если каст неуспешен)(для работы dynamic_cast в базовом классе должен быть хоть один виртуальный метод)
Получилось, спасибо! dynamic_cast пробовал использовать ещё до написания поста, но не прокатывало... видимо неправильно использовал.

UPD: А не... рано обрадовался. Забыл подчистить виртуальные функции в базовом классе. Удалил - и снова ошибки.
Завтра буду курить вариант CheshireCat
0
 Аватар для igorrr37
2872 / 2019 / 991
Регистрация: 21.12.2010
Сообщений: 3,754
Записей в блоге: 9
14.11.2012, 12:39
hdnn, сделай в базовом классе деструктор виртуальным, иначе не сработает
0
14 / 14 / 10
Регистрация: 14.11.2012
Сообщений: 58
15.11.2012, 17:06  [ТС]
igorrr37, он таким и был изначально, всё равно не прокатило.
Так или иначе, мне начальник объяснил, что делать нужно было по другому и под каждый тип создавать свою переменную. Мол чтоб каждое приложение использовало переменную со своим именем. Так что вопрос снимается. Спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.11.2012, 17:06
Помогаю со студенческими работами здесь

Доступ к открытым методам базового класса при частном наследовании
Всем, привет, возникла проблема. Есть классы 1->2->3. Класс 2 явл наследником 1, а 3 класс является наследником 2. Все наследования...

Callback std::function + доступ к приватным полям класса методам которые не есть их полями
Проблема, товарищи. В прикрепленном архиве 3 файла, из которых состоит моя программа: **main.cpp; prototypes.h; realization.cpp** 1....

Почему объект производного класса не видит префиксный оператор из базового класса?
Короче создал я базовый класс с перегруженным префиксным оператором ++. Потом чтоб его затюнинговать, сделал ему производный класс с...

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого класса): ozenka - объект базового класса, а ves- производного ...

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
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(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru