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

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

Войти
Регистрация
Восстановить пароль
 
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
#1

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

24.09.2012, 18:30. Просмотров 308. Ответов 9
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
class OperationBehavior{
    virtual TMMatrix calc();
};
 
class GaussianInverse: public OperationBehavior {
      TMMatrix calc(TMMatrix* matrx_1);
};
есть два класса , как видно один родитель другого , но когда я пытаюсь вызвать метод экземляра наследника ругается на недоступность метода calc(...) что делаю не так?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2012, 18:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что не так с виртуальным методом (C++):

Разница между виртуальным и простым методом - C++
Здравствуйте! Подскажите пожалуйста... Я прочитал про виртуальные методы в классах, и, как было описано, что виртуальные методы служат...

можно объявлять конкретный класс с чисто виртуальным методом - C++
можно объявлять конкретный класс с чисто виртуальным методом

С++ что не так? (Отсортировать массив методом выбора элементов и вывести) - C++
#include "stdafx.h"; #include "iostream" using namespace std; void main () { setlocale (0, "rus"); cout <<"Легензов...

Как сделать так что я мог умножать не на два числа а на 3,4,5 и так далее? - C++
Вот код: #include <iostream> #include <conio.h> using namespace std; int main(){ float a,c; char b; skip: ...

Что в коде ни так? while не работает так, как ожидаю - C++
Написанный код, как я думаю, должен выдавать цифры от 0 до 1000, столбиком. Но выдает начиная от 702 до 1000. Что ни так понимаю, где...

Что-то не то с Майкрсофт визуал студио 2010 или я что-то не так делаю - C++
Дело в том что при запуске вот этой программы: #include <iostream> using namespace std; int main () { for (int i=100; i<=999;...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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);
};
1
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
24.09.2012, 18:34  [ТС] #3
не думал что стандартная область видимости private , спасибо
0
DU
1483 / 1059 / 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() // а так все ок.
1
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
24.09.2012, 19:37  [ТС] #5
У меня немного обратная проблема , я инициализирую свой абстрактный класс с пустой функцией калк , а потом хочу , какимто образом через него перегружать функцию соответствующих классов наследников
C++
1
2
OperationBehavior ob=GaussianInverse();
ob.calc(parametrs);
помогите мне какой нибудь идеей как это можно былоб реализовать
0
go
Эксперт C++
3586 / 1366 / 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 Посмотреть сообщение
помогите мне какой нибудь идеей как это можно былоб реализовать
Так что не получается?
1
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.09.2012, 19:44 #7
сигнатуры виртуальной функции во всех наследниках должна быть такой же, как и в базовом классе. а не замещение (переопределение) виртуальной функции.
более подробно написано у Саттера в "Решении сложных задач", правило 3.2
Вот у вас в базе виртуальная функция такая:
virtual TMMatrix calc();
а в производном такая:
TMMatrix calc(TMMatrix* matrx_1);

хотите, чтобы виртуальные функции работали так, как пишут во всех книгах для начинающих - сделайте их сигнатуры одинаковыми.
1
Nixy
ComfyMobile
400 / 281 / 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 секунд
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.09.2012, 19:52 #9
почитайте еще раз литературу про абстрактные классы.
если кратко - язык не поддержывает такую возможность.
сигнатуры виртуальных функций должны совпадать. (есть маленькое исключение, но оно вам не поможет).
1
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
24.09.2012, 20:01  [ТС] #10
да, внимательно прочитав , четко написано , что виртуальная функция и перегрузка вещи не совместимые , буду выкручиватся , всем спасибо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2012, 20:01
Привет! Вот еще темы с ответами:

Что в программе делает так, что процессор грузится на 100%? - C++
Я не очень разбираюсь в С++, поэтому прошу вашей подсказки по поводу нагрузки на процессор. Вот код программы, на компьютере жрет всю...

Список: Что не так с выводом списка, потому что выводится какой-то мусор? - C++
#include <iostream> using namespace std; struct point { int data;//информационное поле-это даннные объявленного или используемого...

Лучший интерактивный самоучитель с++, но так понравился, что думаю, а что если после python изучать с++? - C++
http://academy.cppstudio.com/courses/ 1.) поделитесь опытом после какого языка вы перешли на с++. 2.) Что вам нравится/не очень в языке...

Как сделать так,что бы при введение,например 0;0 выдавалось сообщение,что точка находится на границе? - C++
#include <iostream> using namespace std; int main(){ double x, y; int R=10 cout << "Введите x: " <<...


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

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

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