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

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

Войти
Регистрация
Восстановить пароль
 
riv94
64 / 64 / 11
Регистрация: 13.02.2011
Сообщений: 390
#1

Может ли виртуальная функция возвращать значения разных типов? - C++

15.05.2014, 14:50. Просмотров 765. Ответов 10
Метки нет (Все метки)

Привет, форумчане!
Столкнулся с небольшой проблемкой и интересуюсь ответом на вопрос!
Может ли виртуальная функция возвращать значения различных типов?! И если не может, то можно либо как-то хитро извернуться и все же реализовать это какими-либо извращенными методами?!
Большое спасибо за внимание!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2014, 14:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Может ли виртуальная функция возвращать значения разных типов? (C++):

Функция приема разных типов в классе - C++
Сразу скажу что надо. Есть функция pow(), так вот она принимает разные типы данных. У меня класс хочу сделать тоже самое. Подскажите как, я...

Шаблонная функция принимает 2 аргумента разных типов и возвращает больший из них - C++
Не могу сообразить как ее правильно написать. Функция может возвратить или T1 или T2 template <typename T1, typename T2> ?...

Функция swap перестановки значений двух переменных для данных разных типов. Используйте template - C++
не могу решить ( честно говоря вообще не понимаю его ) ((((( Напишите функцию swap перестановки значений двух переменных для данных...

Реализовать двусвязный список. В разных узлах одного списка может быть любой объект одного из допустимых типов (своих знаний не хватает) - C++
Вобщем делаю тестовые задания. На одно мне даже ответили, результат отрицательный. Помогите понять если кто поймёт его не так как я или...

Зачем нужно возвращать ссылку на объекты потоковых типов? - C++
В книжке Герберта Шилдта четко и ясно указано, что для того, чтобы перегружать операции ввода-вывода, надо возвращать ссылку на объект...

Чистая виртуальная функция функция не имеет оператора переопределения - C++
Пишу программу для записи заметок. Есть 2 класса: Page и Note. Note наследуется от Page. Page.h #pragma once ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ilot
Модератор
Эксперт С++
1809 / 1166 / 226
Регистрация: 16.05.2013
Сообщений: 3,069
Записей в блоге: 5
Завершенные тесты: 1
15.05.2014, 15:04 #2
Возвращать не может потому как указатель на виртуальную ф-ю будет иметь различные типы, а потому они не могут храниться в одной таблице, но может вам нужен шаблон? Не думали?
nmcf
5309 / 4629 / 1548
Регистрация: 14.04.2014
Сообщений: 18,437
15.05.2014, 15:08 #3
Опиши и возвращай структуру со всеми вариантами возвращаемых данных и идентификатором, указывающим, что именно возвращено.
riv94
64 / 64 / 11
Регистрация: 13.02.2011
Сообщений: 390
15.05.2014, 15:17  [ТС] #4
Ilot, конечно же думал, но нам преподаватель наложил мораторий на использование шаблонов
Ilot
Модератор
Эксперт С++
1809 / 1166 / 226
Регистрация: 16.05.2013
Сообщений: 3,069
Записей в блоге: 5
Завершенные тесты: 1
15.05.2014, 15:22 #5
Тогда остается один вариант передавать аргумен по ссылке. Но тогда возвращаемые значения должны относится к одной иерархии наследования.
А вообще-то не помешало бы привести пример кода.
outoftime
║XLR8║
509 / 431 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
15.05.2014, 15:26 #6
riv94, (void *) или наследование базового класса. И первое и второе даст то что нужно.
riv94
64 / 64 / 11
Регистрация: 13.02.2011
Сообщений: 390
15.05.2014, 15:35  [ТС] #7
Ilot, возвращаемые значения относятся к одной иерархии наследования!)
Ilot
Модератор
Эксперт С++
1809 / 1166 / 226
Регистрация: 16.05.2013
Сообщений: 3,069
Записей в блоге: 5
Завершенные тесты: 1
15.05.2014, 15:39 #8
Вот видите как иногда полезно как можно полно ставить вопрос
outoftime
║XLR8║
509 / 431 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
15.05.2014, 16:07 #9
riv94, с классами прикольней получается, да и строгая типизация не нарушается как с указателем на войд.
Кликните здесь для просмотра всего текста
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <string>
 
class BaseRetType {
public:
    BaseRetType(std::string value = "BaseRetType") : name(value) { }
    virtual std::string get_name() { return "BaseRetType"; } 
    std::string name;
};
 
class ARetType : public BaseRetType {
public:
    ARetType() : BaseRetType("ARetType") { }
    std::string get_name() { return "ARetType"; }
};
 
class BRetType : public BaseRetType {
public:
    BRetType() : BaseRetType("BRetType") { }
    std::string get_name() { return "BRetType"; } 
};
 
class B {
public:
    BaseRetType create(int i) {
        BaseRetType res;
        
        if (i == 0) res = BaseRetType();
        else if (i == 1) res = ARetType();
        else res = BRetType();
 
        return res;
    }
};
 
int main(int argc, char *argv[]) {
    B b1;
    BaseRetType b2 = b1.create(0);
    std::cout << b2.get_name() << std::endl;
    std::cout << b2.name << std::endl;
    b2 = b1.create(1);
    std::cout << b2.get_name() << std::endl;
    std::cout << b2.name << std::endl;
    b2 = b1.create(2);
    std::cout << b2.get_name() << std::endl;
    std::cout << b2.name << std::endl;
}
Bash
1
2
3
4
5
6
7
8
ruslan@TFTM-K53TA:~/Programming/c++/cyberforum$ g++ main.cpp -o main -std=c++98
ruslan@TFTM-K53TA:~/Programming/c++/cyberforum$ ./main 
BaseRetType
BaseRetType
BaseRetType
ARetType
BaseRetType
BRetType


Добавлено через 6 минут
По коду есть непонятные места?
riv94
64 / 64 / 11
Регистрация: 13.02.2011
Сообщений: 390
15.05.2014, 16:17  [ТС] #10
outoftime, суть задачи, поставленной передо мной, заключается в том, что мне надо создать абстрактный базовый класс, класс-потомок, наследующий от базового под public. Максимальную функциональность нужно реализовать в абстрактном классе. В классах квадратные матрицы. В базовом классе я память под char выделяю, а уже какие-то операции, конкретно привязанные к типу выполняю в подклассах. А потом перегрузить потоки ввода-вывода, перегрузить различные операции. Так вот:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// v02.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <fstream>
 
using namespace std;
const int float_size=32, double_size=64;   //битовая размерность типа!
int razm;
 
class AbstractMatrix
{
public:
    
    char *arr, *arr1;
    int MatrixSize, TypeMatrixSize;
    AbstractMatrix(int razm, int TSize);   //конструктор создания матрицы заданной размерности
    friend istream &operator>>(istream &stream, AbstractMatrix &obj);
    friend ostream &operator<<(ostream &stream, AbstractMatrix obj);
        
};
 
istream &operator>>(istream &stream, AbstractMatrix &obj)
{   
    cout<<"\nENTER MEMBERS OF MATRIX\n";
    for (int i=0; i<obj.MatrixSize*obj.MatrixSize*obj.TypeMatrixSize; i+=obj.TypeMatrixSize) stream>>(float&) obj.arr[i]; 
    //НО ЗДЕСЬ НЕЛЬЗЯ КОНКРЕТНО ПРИВЯЗЫВАТЬСЯ К ТИПУ!!!
    //ТУТ ДОЛЖНА ВЫЗЫВАТЬСЯ ВИРТУАЛЬНАЯ ФУНКЦИЯ,ВЫПОЛНЯЮЩАЯ ЯВНОЕ ПРИВЕДЕНИЕ ТИПОВ ОТНОСИТЕЛЬНО КЛАССА ПОТОМКА!!!
    return stream;
};
ostream &operator<<(ostream &stream, AbstractMatrix obj)
{
    int k=0;
    cout<<"\nMATRIX\n";
    for (int i=0; i<obj.MatrixSize*obj.MatrixSize*obj.TypeMatrixSize; i+=obj.TypeMatrixSize) 
    {
        k++;
        stream<<(float&) obj.arr[i]<<' ';
        if (k%obj.MatrixSize==0) stream<<endl;
    };
    return stream;
};
 
 
AbstractMatrix::AbstractMatrix(int razm, int TSize)   //конструктор создания матрицы заданной размерности
{
    MatrixSize=razm;
    TypeMatrixSize=TSize/8;
    arr=new char[MatrixSize*MatrixSize*TypeMatrixSize];
};
 
 
class FloatMatrix: public AbstractMatrix
{
public:
    FloatMatrix(int razm):AbstractMatrix(razm, float_size){};  //конструктор создания матрицы заданной размерности
};
 
void main()
{
    cout<<"\nINSERT Razm\n";
    cin>>razm;
    FloatMatrix b(razm);
    cin>>b;
    cout<<b;
 
}
Я хотел бы сразу использовать вирт.функцию при перегрузке потоков, но не понятно было, как ее использовать в виду того, что она возвращает значения конкретно одного типа данных!
outoftime
║XLR8║
509 / 431 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
15.05.2014, 18:41 #11
riv94, Напиши задание.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2014, 18:41
Привет! Вот еще темы с ответами:

Что может возвращать выражение в С++? - C++
В стандарте написано, что &quot;Выражение может возвращать значение в качестве результата и может вызывать побочные эффекты.&quot; Правильно ли...

Найти предельные значения для целочисленных типов. Не использовать заранее определенные константы границ типов. - C++
Буду благодарен! Найти предельные значения для целочисленных типов. Не использовать заранее определенные константы границ типов.

Виртуальная функция - C++
Ругается на метод virtual bool isOveersize() из класса publication. Что не так ? #include &quot;stdafx.h&quot; #include &lt;string&gt; #include...

виртуальная функция - C++
class B { private: int a; int b; public: virtual void show();//есть виртуальная функция,которая выводит a и b } class...


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

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

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