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

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

27.07.2011, 11:14. Просмотров 1214. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2011, 11:14
Ответы с готовыми решениями:

Переопределение виртуальной функции в производном классе
Здравствуйте, я столкнулся с проблемой при переопределения виртуальной функции в производном...

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

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

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

8
Каратель
Эксперт С++
6596 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
27.07.2011, 11:27 2
ну дык где код функции main ?
0
В астрале
Эксперт С++
8026 / 4783 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
27.07.2011, 11:28 3
Глупец, Есть. Сделать функцию не чисто виртуальной. Чисто виртуальная функция подразумевает ту же сигнатуру в производных классах.
0
24 / 24 / 3
Регистрация: 17.05.2011
Сообщений: 141
27.07.2011, 11:50  [ТС] 4
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
105 / 105 / 11
Регистрация: 17.10.2010
Сообщений: 283
27.07.2011, 11:54 5
Не в тему, но все же...
virtual inline - это как вообще?
Компилятор проигнорирует inline для виртуальной функции.

Ну и сама задача - виртуальная функция с различными параметрами на C++ таким образом не решается.
1
24 / 24 / 3
Регистрация: 17.05.2011
Сообщений: 141
27.07.2011, 11:57  [ТС] 6
soft.creator, про inline спасибо, я тоже сомневался, что сработает, но компил не ругнуля по крайней мере, и решил пока не править)))
А как тогда решить...может предложите хотя бы где почитеать, или пример напишите?)))
0
Каратель
Эксперт С++
6596 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
27.07.2011, 11:57 7
косяк в том что чисто виртуальная функция не переопределяется в классах наследниках, а значит классы наследники такие же абстрактные как и базовый, а объект абстрактного класса создать никак нельзя
0
Эксперт С++
2139 / 1569 / 240
Регистрация: 29.05.2011
Сообщений: 3,264
27.07.2011, 12:00 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 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  [ТС] 9
Maxwe11,Как бы это в первом посте было написано...это вполне понятно...
вопрос стоит следующим образом:"как сделать так, чтоб эта функция заработала с разными параметрами"

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

Добавлено через 1 минуту
grizlik78, спасибо...)))
и чего до меня раньше не дошло...)))
думаю, тема закрыта)))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.07.2011, 12:05

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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