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

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

Войти
Регистрация
Восстановить пароль
 
hdnn
11 / 11 / 3
Регистрация: 14.11.2012
Сообщений: 51
Завершенные тесты: 1
#1

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

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

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

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

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

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

Создание указателя типа базового класса на экземпляр производного класса - C++
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса - наследника, для чего это может применяться?

Указатель на объект базового класса и адрес объекта производного класса - C++
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; } ~Class1() {delete j;}

5
igorrr37
1647 / 1275 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
14.11.2012, 11:26 #2
можно скастовать базовый указатель в производный указатель через dynamic_cast (вернёт 0 если каст неуспешен)(для работы dynamic_cast в базовом классе должен быть хоть один виртуальный метод)
1
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,379
14.11.2012, 11:30 #3
Цитата Сообщение от hdnn Посмотреть сообщение
Вот и вопрос: можно ли(и как правильно) присвоить объект производного класса к переменной базового так, чтобы был доступ к методам производного был доступ без их описания как виртуальных в базовом?
Никак. Базовый класс - он на то и базовый, что объявляет общий интерфейс для всех наследников.

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

UPD: А не... рано обрадовался. Забыл подчистить виртуальные функции в базовом классе. Удалил - и снова ошибки.
Завтра буду курить вариант CheshireCat
0
igorrr37
1647 / 1275 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
14.11.2012, 12:39 #5
hdnn, сделай в базовом классе деструктор виртуальным, иначе не сработает
0
hdnn
11 / 11 / 3
Регистрация: 14.11.2012
Сообщений: 51
Завершенные тесты: 1
15.11.2012, 17:06  [ТС] #6
igorrr37, он таким и был изначально, всё равно не прокатило.
Так или иначе, мне начальник объяснил, что делать нужно было по другому и под каждый тип создавать свою переменную. Мол чтоб каждое приложение использовало переменную со своим именем. Так что вопрос снимается. Спасибо за помощь!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2012, 17:06
Привет! Вот еще темы с ответами:

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса - C++
Класс В является производным от класса А. Определить обработчик исключительной ситуации на преобразование указателя базового класса А на...

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

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса - C++
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток из базового класса для объекта производного класса, если...

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса? - C++
я хотел так, но программа просто падает void Student::add(Base** head) { cout << "I here" << endl; this->setName(); //все...


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

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
15.11.2012, 17:06
Ответ Создать тему
Опции темы

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