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

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

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

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

14.11.2012, 11:03. Просмотров 1013. Ответов 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 и у каждого свои методы. И описывать их в базовом, чувствую, что не правильно.

Вот и вопрос: можно ли(и как правильно) присвоить объект производного класса к переменной базового так, чтобы был доступ к методам производного был доступ без их описания как виртуальных в базовом?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2012, 11:03     Доступ к методам производного класса
Посмотрите здесь:

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

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

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

Конструктор производного класса - C++
Доброго времени суток!! Значит так, есть у меня две строки большая и маленькая и два класс String и bString, где bString производный от...

Тип производного класса - C++
Как можно узнать тип производного класса на этапе компиляции?#include <iostream> #include <type_traits> struct A {}; struct B : A...

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

Вызов методов производного класса - C++
Возникла проблема с выполнением задачи. программа запускается, работает, но почему-то не выводит метод scan и print наследовательного...

Конструкторы базового и производного класса - C++
class first { public: first(int a):first(a){} void Setfirst(int a){first=a;} int Getfirst(){return first;} private: ...

Инициализация конструкторов производного класса - C++
Есть два класса class A { int x,y; A(int a, int b): x(a), y(b) { } };

Ошибка в функции производного класса - C++
Доброго времени суток! У меня такая проблема: не работает функция поп-фронт в производном классе. Не могу понять почему. Если я пробую...


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

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

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

UPD: А не... рано обрадовался. Забыл подчистить виртуальные функции в базовом классе. Удалил - и снова ошибки.
Завтра буду курить вариант CheshireCat
igorrr37
1642 / 1270 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
14.11.2012, 12:39     Доступ к методам производного класса #5
hdnn, сделай в базовом классе деструктор виртуальным, иначе не сработает
hdnn
11 / 11 / 3
Регистрация: 14.11.2012
Сообщений: 48
Завершенные тесты: 1
15.11.2012, 17:06  [ТС]     Доступ к методам производного класса #6
igorrr37, он таким и был изначально, всё равно не прокатило.
Так или иначе, мне начальник объяснил, что делать нужно было по другому и под каждый тип создавать свою переменную. Мол чтоб каждое приложение использовало переменную со своим именем. Так что вопрос снимается. Спасибо за помощь!
Yandex
Объявления
15.11.2012, 17:06     Доступ к методам производного класса
Ответ Создать тему
Опции темы

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