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

Что не так с виртуальным методом - C++

Восстановить пароль Регистрация
 
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
24.09.2012, 18:30     Что не так с виртуальным методом #1
C++
1
2
3
4
5
6
7
class OperationBehavior{
    virtual TMMatrix calc();
};
 
class GaussianInverse: public OperationBehavior {
      TMMatrix calc(TMMatrix* matrx_1);
};
есть два класса , как видно один родитель другого , но когда я пытаюсь вызвать метод экземляра наследника ругается на недоступность метода calc(...) что делаю не так?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KostyaKulakov
Заблокирован
24.09.2012, 18:31     Что не так с виртуальным методом #2
C++
1
2
3
4
5
6
7
8
class OperationBehavior{
    virtual TMMatrix calc();
};
 
class GaussianInverse: public OperationBehavior {
public:
      TMMatrix calc(TMMatrix* matrx_1);
};
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
24.09.2012, 18:34  [ТС]     Что не так с виртуальным методом #3
не думал что стандартная область видимости private , спасибо
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.09.2012, 19:01     Что не так с виртуальным методом #4
тут главное осознавать что вторая функция не является виртуальной и ее вызов не произойдет при вызове метода calc через указатель на базу. кроме того, во втором классе новый метод скрывает метод calc базового. поэтому такой код компилироваться не будет:

C++
1
2
3
4
5
GaussianInverse gi;
gi.calc(); // ошибка. функция калк хочет один параметр.
 
OperationBehavior& ob = gi;
ob.calc() // а так все ок.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
24.09.2012, 19:37  [ТС]     Что не так с виртуальным методом #5
У меня немного обратная проблема , я инициализирую свой абстрактный класс с пустой функцией калк , а потом хочу , какимто образом через него перегружать функцию соответствующих классов наследников
C++
1
2
OperationBehavior ob=GaussianInverse();
ob.calc(parametrs);
помогите мне какой нибудь идеей как это можно былоб реализовать
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
24.09.2012, 19:40     Что не так с виртуальным методом #6
Цитата Сообщение от DU Посмотреть сообщение
GaussianInverse gi;
gi.calc(); // ошибка. функция калк хочет один параметр.
C++
1
2
GaussianInverse gi;
gi.OperationBehavior::calc();
Естественно если методы будут объявлены как public

Добавлено через 2 минуты
Цитата Сообщение от Nixy Посмотреть сообщение
с пустой функцией калк
Покуда ее я не вижу.
Цитата Сообщение от Nixy Посмотреть сообщение
помогите мне какой нибудь идеей как это можно былоб реализовать
Так что не получается?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.09.2012, 19:44     Что не так с виртуальным методом #7
сигнатуры виртуальной функции во всех наследниках должна быть такой же, как и в базовом классе. а не замещение (переопределение) виртуальной функции.
более подробно написано у Саттера в "Решении сложных задач", правило 3.2
Вот у вас в базе виртуальная функция такая:
virtual TMMatrix calc();
а в производном такая:
TMMatrix calc(TMMatrix* matrx_1);

хотите, чтобы виртуальные функции работали так, как пишут во всех книгах для начинающих - сделайте их сигнатуры одинаковыми.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
24.09.2012, 19:48  [ТС]     Что не так с виртуальным методом #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class OperationBehavior{
    public:
    virtual TMMatrix calc();
};
 
class GaussianInverse: public OperationBehavior {
    public:
      TMMatrix calc(TMMatrix* matrx_1);
 
};
 
//есть класс Калькулятор который определяет каким должен быть OperationBehavior
 
class CalculatorMatrix{
    private:
    OperationBehavior operation;
    public:
    CalculatorMatrix(OperationBehavior *operation);
    void setOperationBehavior(OperationBehavior *operation);
    OperationBehavior getOperationBehavior();
};
 
// И я пытаюсь сделать вот такую вещь
 
CalculatorMatrix calc=CalculatorMatrix(new GaussianInverse());
TMMatrix result=calc.getOperationBehavior().calc(//тут параметр типа указатель на TMMatrix));
Добавлено через 2 минуты
Цитата Сообщение от DU Посмотреть сообщение
сигнатуры виртуальной функции во всех наследниках должна быть такой же, как и в базовом классе. а не замещение (переопределение) виртуальной функции.
более подробно написано у Саттера в "Решении сложных задач", правило 3.2
Вот у вас в базе виртуальная функция такая:
virtual TMMatrix calc();
а в производном такая:
TMMatrix calc(TMMatrix* matrx_1);

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

Добавлено через 17 секунд
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.09.2012, 19:52     Что не так с виртуальным методом #9
почитайте еще раз литературу про абстрактные классы.
если кратко - язык не поддержывает такую возможность.
сигнатуры виртуальных функций должны совпадать. (есть маленькое исключение, но оно вам не поможет).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2012, 20:01     Что не так с виртуальным методом
Еще ссылки по теме:

С++ что не так? (Отсортировать массив методом выбора элементов и вывести) C++
C++ Разница между виртуальным и простым методом
Отсортировать все строки методом быстрой сортировки так, чтоб элементы в них располагались по возрастанию C++

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

Или воспользуйтесь поиском по форуму:
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
24.09.2012, 20:01  [ТС]     Что не так с виртуальным методом #10
да, внимательно прочитав , четко написано , что виртуальная функция и перегрузка вещи не совместимые , буду выкручиватся , всем спасибо
Yandex
Объявления
24.09.2012, 20:01     Что не так с виртуальным методом
Ответ Создать тему
Опции темы

Текущее время: 11:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru