Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
24 / 24 / 3
Регистрация: 17.05.2011
Сообщений: 141

Ошибка при вызове виртуальной функции в производном классе

27.07.2011, 11:14. Показов 2156. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, извините, если подобная тема появлялась, но либо у меня руки не от туда растут, либо ее небыло...

проблема в следующем: есть базовый класс, и два наследника(отличаются совсем немного, но...)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class B{
    public:
    virtual inline A* funk()=0;
};
 
class N: public B{
    long* val;
    public:
    inline A* funk(long* param){
        val=param;
        return this;
    }
};
class S: public B{
    char* val;
    public:
    inline A* funk(char* param){
        val=param;
        return this;
    }
};
так вот при вызове funk в main либо где-то еще возникает ошибка, что и поятно...да и создать наследников тоже нельзя, ибо она ни где не переопределена и они получаются виртуальными...
Как исправить есть идеи???)))
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.07.2011, 11:14
Ответы с готовыми решениями:

Переопределение виртуальной функции в производном классе
Здравствуйте, я столкнулся с проблемой при переопределения виртуальной функции в производном классе. Код: class dist { // base ...

Ошибка компиляции при вызове виртуальной функции
Здравствуйте. Сильно не плюйтесь, в С я не силен. Пишу на джаве, но попал в руки код, в котором нужно разобраться. Не пойму в чем...

Ошибка при вызове шаблона функции в другом классе
цель моей функции- выводить значения переменной в любом формате. функция в классе : .h class A { template <typename...

8
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
27.07.2011, 11:27
ну дык где код функции main ?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.07.2011, 11:28
Глупец, Есть. Сделать функцию не чисто виртуальной. Чисто виртуальная функция подразумевает ту же сигнатуру в производных классах.
0
24 / 24 / 3
Регистрация: 17.05.2011
Сообщений: 141
27.07.2011, 11:50  [ТС]
Maxwe11,
C++
1
2
3
4
5
B** mass;
mass=new B*[2];
mass[0]=new N;//вот здесь
mass[1]=new S;//здесь
mass[1]->funk("ghjkl;asd");//и здесь будут косяки
ForEveR, извините, не совсем понял, т.е. если funk не будет чисто виртуальной функцией, то
C++
1
B* S::funk(char* param);
будет считаться ее перегрузкой, или просто компилятор сам поймет, что надо вызвать именно ее...

Добавлено через 8 минут
да и, извините, в первом посте в коде косяк небольшой:
не
Цитата Сообщение от Глупец Посмотреть сообщение
virtual inline A* funk()=0;
а
C++
1
virtual inline B* funk()=0;
у наследников соответственно...
0
 Аватар для soft.creator
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
27.07.2011, 11:54
Не в тему, но все же...
virtual inline - это как вообще?
Компилятор проигнорирует inline для виртуальной функции.

Ну и сама задача - виртуальная функция с различными параметрами на C++ таким образом не решается.
1
24 / 24 / 3
Регистрация: 17.05.2011
Сообщений: 141
27.07.2011, 11:57  [ТС]
soft.creator, про inline спасибо, я тоже сомневался, что сработает, но компил не ругнуля по крайней мере, и решил пока не править)))
А как тогда решить...может предложите хотя бы где почитеать, или пример напишите?)))
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
27.07.2011, 11:57
косяк в том что чисто виртуальная функция не переопределяется в классах наследниках, а значит классы наследники такие же абстрактные как и базовый, а объект абстрактного класса создать никак нельзя
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
27.07.2011, 12:00
Ну, в данном случае можно-таки сделать одинаковую сигнатуру
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class B{
        public:
        virtual B* funk(void*)=0;
};
 
class N: public B{
        long* val;
        public:
        B* funk(void* param){
                val=(long*)param;
                return this;
        }
};
class S: public B{
        char* val;
        public:
        B* funk(void* param){
                val=(char*)param;
                return this;
        }
};
1
24 / 24 / 3
Регистрация: 17.05.2011
Сообщений: 141
27.07.2011, 12:05  [ТС]
Maxwe11,Как бы это в первом посте было написано...это вполне понятно...
вопрос стоит следующим образом:"как сделать так, чтоб эта функция заработала с разными параметрами"

т.е. если мы вызываем ее для класса S с параметром long-она не сможет ее принять, если с char-все нормально, но при этом же объекты классов наследников хранятся в одном массиве...

Добавлено через 1 минуту
grizlik78, спасибо...)))
и чего до меня раньше не дошло...)))
думаю, тема закрыта)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.07.2011, 12:05
Помогаю со студенческими работами здесь

Запрет на использование функции в производном классе
Имеется class List представляющий двунаправленный список, с реализованными виртуальными методами splice(...), merge(...), push_back(...),...

Почему при переопределении виртуального метода в производном классе выводится метод базового?
Всем добра! Помогите разобраться почему при переопределении виртуального метода в производном классе выводится метод базового ? По идеи...

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

Почему при множественном наследовании в производном классе оказывется несколько экземпляров общего базового класса
Я не очень хорошо знаю плюсы, но я разбираюсь. Учусь, и мне хотелось бы иногда получать ответы на глупые мои вопросы. Кто может помочь? ...

Ошибка при вызове функции
Ошибка в строке 90, при пошаговом выполнении она появляется при вызове функции, до захода в нее, хотя список сформирован правильно, т.к. до...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru