Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2015, 16:31   #1
Даша1046
Пользователь
 
Регистрация: 15.01.2013
Сообщений: 15
По умолчанию Полиморфизм и вызов функции при наследовании

Здравствуйте! Существует такая проблема, реализуется класс матрица, где базовый класс создает заполняет и выводит матрицы, а производные классы представляют собой различные операции над матрицами ( 1 класс - 1 операция, операции : сложение, умножение, транспонирование, умножение на число) . Необходимо реализовать полиморфизм. Я категорически не понимаю, как в подобной программе можно реализовать полиморфизм, не вижу смысла использовать виртуальные функции, подскажите пожалуйста!
И ещё одна проблема : как вызывать операции из производных классов? пробовала делать с помощью перегрузки , что-то вроде operator+(const Matrix &a), но не знаю как вызвать в мейне.cpp этот оператор, а если делать через функцию void , то в такой функции указатель *this не работает, из-за несоответствия типов. Заранее спасибо!
Даша1046 вне форума Ответить с цитированием
Старый 01.06.2015, 16:46   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Цитата:
не вижу смысла использовать виртуальные функции
Так ентож учебная задача. Они обычно несколько надуманы и упрощены. Не надо искать сокровенный смысл, просто отрабатывается тема.

Цитата:
Я категорически не понимаю, как в подобной программе можно реализовать полиморфизм
Тогда вам действительно нужно почитать эту тему. У вас же все в условии написано: в базовом делаете виртуальную функцию типа МатриксОперейшон, а в производных переопределяете ее как надо - сложение, умножение,...

Цитата:
как вызывать операции из производных классов?
Как же вы до этого с классами работали? Создать объекты и вызывать.

Цитата:
а если делать через функцию void , то в такой функции указатель *this не работает, из-за несоответствия типов
Не из-за несоответствия типов он там не работает, а просто потому что его там не существует.
p51x вне форума Ответить с цитированием
Старый 01.06.2015, 18:23   #3
Даша1046
Пользователь
 
Регистрация: 15.01.2013
Сообщений: 15
По умолчанию

Спасибо! А можно ещё 2 вопроса?
1) А что должно быть внутри этой виртуальной функции в базовом классе?
2) Как сделать так, чтобы *this там работал?
Даша1046 вне форума Ответить с цитированием
Старый 01.06.2015, 19:22   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Цитата:
1) А что должно быть внутри этой виртуальной функции в базовом классе?
Да что хотите. Обычно в таком варианте ее вообще делают чисто виртуальной (естественно, если не надо создавать объекты базового класса).

Цитата:
2) Как сделать так, чтобы *this там работал?
Никак. this это указатель на текущий объект. Если у вас нет объекта, то и не будет this.
p51x вне форума Ответить с цитированием
Старый 01.06.2015, 20:31   #5
Даша1046
Пользователь
 
Регистрация: 15.01.2013
Сообщений: 15
По умолчанию

Прошу прощения, но битый час сижу и всё равно застряла, не могу вывести результат.
\вот например функция сложения из производного класса:
Код:
*Matrix MatrixOperation(Matrix &ob) { // Сложение
	 Matrix temp;                        // реализовано с помощью временного объекта
    temp.N = this->N; 
    temp.M = this->M; 
    int i, j;
    temp.matrix = new double*[temp.N]; 
    for ( i = 0; i < temp.N; ++i) 
        temp.matrix[i] = new double[temp.M]; 
 
    for ( i = 0; i < temp.N; ++i) 
        for ( j = 0; j < temp.M; ++j) 
            temp.matrix[i][j] = this->matrix[i][j] + ob.matrix[i][j]; 
    return temp;
 };
/* void show_who (Matrix &r) {
r.MatrixOperation();
}
в базовом создается , заполняется и выводится матрица.
в mein.cpp вызываются массивы m1 и m2.
Код:
Matrix m1(3,3);
	m1.Enter(); 
    m1.Show(); 
	Matrix m2(3,3);
	m2.Enter(); 
    m2.Show();
Подскажите пожалуйста, как вывести с помощью этой функции матрицу m3, которая является результатом сложения m1 и m2??

Последний раз редактировалось Stilet; 02.06.2015 в 07:34.
Даша1046 вне форума Ответить с цитированием
Старый 01.06.2015, 21:36   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Ну так вызовите вашу функцию и сохраните результат.

Код:
m3 = m1.MatrixOperation(m2);
m3.Show();
p51x вне форума Ответить с цитированием
Старый 01.06.2015, 23:03   #7
Даша1046
Пользователь
 
Регистрация: 15.01.2013
Сообщений: 15
По умолчанию

Спасибо большое!!
Даша1046 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с методом при наследовании rommster Общие вопросы C/C++ 7 15.09.2011 18:56
ГЛЮКИ при наследовании фреймов Delphi 7 AnTe Компоненты Delphi 3 10.12.2010 09:02
Полиморфизм. Как реализовать вызов метода? katbka Общие вопросы C/C++ 12 20.05.2010 22:02
Перегрузка == при наследовании paramon Общие вопросы C/C++ 5 17.06.2008 00:17
Вызов процедуры при обьявлении функции ivannikov Общие вопросы Delphi 6 12.03.2008 13:20