С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для bullock
1 / 1 / 1
Регистрация: 19.08.2015
Сообщений: 27

Возврат значения из полиморфной функции

22.07.2016, 16:24. Показов 2413. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем. Ребят не знаю как правильно сформулировать свой вопрос. Суть вот в чем:
В базовом классе Cell определена виртуальная функция Get, надо чтобы наследники этого класса могли переопределять эту функцию НО с своими выходными параметрами. Вот пример:
C++ (Qt)
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
#include <iostream>
using namespace std;
 
class Cell
{
   public:
          virtual void Get () = 0;
};
 
class CellInt: public Cell
{
   public:
          int Get ()
          {
               return 1;
          }
};
int main ()
{
    Cell *c;
    CellInt s;
    c = &s;
    
    return 0;
}
Как реализовать подобное поведение?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.07.2016, 16:24
Ответы с готовыми решениями:

Вызов полиморфной функции
Добрый день. Никак не могу понять, почему данная программа все же выводит &quot;А&quot;. Не мог бы кто-нибудь объяснить? Заранее благодарен. ...

Возврат значения функции
Что такое возврат значения функции? я уже всю голову изломал, что и куда возвращается? в гугле нашёл мол возвращается результат (куда? в...

Возврат значения из функции
Добрый вечер. Вопрос следующий , как возвратить из функции create последнее значение ЛС , чтоб в дальнейшем использовать в main. ...

14
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.07.2016, 16:27
Лучший ответ Сообщение было отмечено bullock как решение

Решение

1.
"архитектурный костыль"
C++
1
virtual boost::any Get () = 0;
2.
"быстро и сердито"
C++
1
virtual void* Get () = 0;
3.
"мьсе знает толк..."
C++
1
2
3
4
5
6
7
8
class CellInt: public Cell
{
   public:
          void Get ()
          {
               throw 1;
          }
};
1
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
22.07.2016, 16:32
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Цитата Сообщение от bullock Посмотреть сообщение
надо чтобы наследники этого класса могли переопределять эту функцию НО с своими выходными параметрами
Если функции возвращают разные значения, то и пользоваться результатами их вызова надо по-разному (то есть, зная, с каким конкретно типом работаем). Смысл полиморфизма и виртуальных функций в том, что с разными объектами работают одинаково.
Вывод: функция не должна быть виртуальной и, по всей видимости, должна отсутствовать в базовом классе.
2
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.07.2016, 16:45
Цитата Сообщение от Nick Alte Посмотреть сообщение
Вывод: функция не должна быть виртуальной и, по всей видимости, должна отсутствовать в базовом классе.
существует особый класс задач,
где именно такое поведение может быть востребованно.

например:
динамические делегаты.
умеют нацеливаться на любые функции/функции-члены.

причем делегат всегда можно перенацелить на функцию
с другой сигнатурой.

таким образом, необходима возможность
что бы один и тот же делегат мог в разных случаях
принимать/возвращать разные типы данных.

область применения динамических делегатов:
скриптование.
0
 Аватар для bullock
1 / 1 / 1
Регистрация: 19.08.2015
Сообщений: 27
22.07.2016, 16:48  [ТС]
hoggy, Ваш вариант "быстро и сердито" понравился, но квжется он не работает. И если можно объяснитье Ваш 3й вариант, его я увы не понял..
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.07.2016, 17:09
Цитата Сообщение от bullock Посмотреть сообщение
Ваш вариант "быстро и сердито" понравился, но квжется он не работает. И если можно объяснитье Ваш 3й вариант, его я увы не понял..
http://rextester.com/BUKYO57542



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
#include <boost/any.hpp>
#include <iostream>
 
 
struct base
{
    virtual ~base(){}
    virtual boost::any workaround()const = 0;
    virtual void* govnocode()const = 0;
    virtual void total_perversion()const = 0;
};
 
 
struct der: base
{
    // можно вернуть объект любого типа
    virtual boost::any workaround()const {  return 1; }
    
    // можно вернуть указатель на объект любого типа
    virtual void* govnocode()const 
    {
          return new int(2);
    }
    
    // это для тех, кто понимает.
    // за такие приколы могут с работы уволить
    virtual void total_perversion()const 
    {
        throw 3;
    }
};
 
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    base* p = new der;
    
    const int result = boost::any_cast<int>(p->workaround());
    
    
    const int* data = static_cast<int*>(p->govnocode());
    
    
    int catched_result = 0;
    try{
       
        p->total_perversion();
    }
    catch(int& v)
    {
        catched_result = v;
    }
    
    std::cout <<"1 способ вернул результат: " << result << std::endl;
    
    std::cout <<"2 способ вернул результат: " << *data  << std::endl;
    delete data;
    
    std::cout <<"3 способ вернул результат: " << catched_result  << std::endl;
    
    delete p;
 
}
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
22.07.2016, 17:11
Лучший ответ Сообщение было отмечено bullock как решение

Решение

hoggy, Шэф, а как же ООП?
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
#include <iostream>
#include <typeinfo>
 
// я полиморфый void
struct PolymorphicVoid
{
    virtual ~PolymorphicVoid()
    {
    }
};
 
// а я полиморфный int, и я задаюсь вопросом всю свою жизнь: "какой идиот меня придумал?" :(
struct PolymorphicInt : PolymorphicVoid
{
private:
    int value_;
public:
    PolymorphicInt()
            : value_(0)
    {
    }
    operator int()
    {
        return value_;
    }
 
    PolymorphicInt& operator =(const int value)
    {
        value_ = value;
        return *this;
    }
};
 
struct Cell
{
    virtual PolymorphicVoid& get() = 0;
    virtual ~Cell()
    {
    }
};
 
struct CellInt: Cell
{
    PolymorphicInt int_{};
    PolymorphicInt& get() override
    {
        return int_;
    }
};
 
int main()
{
    CellInt ci;
    Cell& c = ci;
    ci.get() = 200;
 
    std::cout << typeid(c.get()).name() << std::endl;
    std::cout << typeid(ci.get()).name() << std::endl;
 
    std::cout << ci.get() << std::endl;
}
bullock, Если вам требуется именно void и int, то мой вариант отпадает, комментарий на это намекает.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.07.2016, 17:27
Цитата Сообщение от Nosey Посмотреть сообщение
Шэф, а как же ООП?
boost::any жеж.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
22.07.2016, 17:38
Барбара Лисков плачет кровавыми слезами


Дали им ковариантность, бери, пользуйся... Нет, не хотят. Хотя страдать
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
22.07.2016, 17:43
Цитата Сообщение от hoggy Посмотреть сообщение
boost::any жеж.
Дык это архитектурный костыль.
А велосипед - это архитектурное Решение

Не по теме:

Всё, отваливаю

0
22.07.2016, 17:44

Не по теме:

Цитата Сообщение от Nosey Посмотреть сообщение
Дык это архитектурный костыль.
А велосипед - это архитектурное Решение
))))))

0
 Аватар для bullock
1 / 1 / 1
Регистрация: 19.08.2015
Сообщений: 27
25.07.2016, 16:04  [ТС]
На самом деле мне надо вот такое поведение:
C++ (Qt)
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
#include <iostream>
using namespace std;
 
class Cell
{
   public:
          virtual ~Cell() {}
};
 
class CellInt: public Cell
{
    int val;
    public:
           CellInt ()
           {
              val= -1;
           }
           operator int () { 
             return val;
           }
           
        
};
int main ()
{
    Cell *c;
    CellInt s;
    c = &s;
    cout << (int)*c;
    return 0;
}
Это пример, а в реальноости надо чтобы были еще классы наследники string double и bool.
Я хочу создать такой тип данных типо таблиы с различными типами данных в колонках:

C++ (Qt)
1
map <string, vector <Cell>> table;
Или я гоню?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.07.2016, 18:25
Цитата Сообщение от bullock Посмотреть сообщение
Это пример, а в реальноости надо чтобы были еще классы наследники string double и bool.
http://rextester.com/OPA21136

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
#include <boost/any.hpp>
#include <iostream>
 
 
struct base
{
    virtual ~base(){}
    virtual boost::any workaround()const = 0;
    
    template<class T> operator T()const 
    {
        return boost::any_cast<T>(this->workaround());
    }
    
};
 
 
struct der: base
{
    der(const int v = 0 ):mValue(v){}
    
    virtual boost::any workaround()const {  return mValue; }
    
    int mValue;
};
 
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    der d(100);
    base& reference = d;
    
    const int result = reference;    
    std::cout <<"результат: " << result << std::endl;
}
Цитата Сообщение от bullock Посмотреть сообщение
Я хочу создать такой тип данных типо таблиы с различными типами данных в колонках:
см в сторону вариативных типов данных.

Цитата Сообщение от bullock Посмотреть сообщение
Или я гоню?
ага.
0
 Аватар для bullock
1 / 1 / 1
Регистрация: 19.08.2015
Сообщений: 27
26.07.2016, 16:12  [ТС]
Посмотрите вот это может быть решением или это совсем говнокод?
C++ (Qt)
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
#include <iostream>
 
class Cell {
    public:
    virtual void Set (int inInt) {}
    virtual void Get (int &outInt) {}
    virtual void Set (float inFloat) {}
    virtual void Get (float &outFloat){}
    virtual ~Cell (){}
};
class CellInt: public Cell {
    int value;
    public:
    CellInt ( ) {}
    void Set (int inInt) { value = inInt;}
    void Get (int &outInt) { outInt = value;}
};
class CellFloat: public Cell {
    float value;
    public:
    CellFloat () {}
    void Set (float inFloat) { value = inFloat;}
    void Get (float &outFloat) { outFloat = value; }
};
int main(){
    Cell *c;
    CellInt ci;
 
    c = &ci;
 
    int in = 123;
    c-> Set (in);
 
    int i = 0; 
    c-> Get (i);
    std::cout << i; 
 
    std::cout << " ";
 
    CellFloat cf;
    c = &cf;
 
    float f = 1.1;
    c->Set (f);
 
    float fout= 0.1;
    c-> Get (fout);
 
    std::cout << fout;
 
}
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.07.2016, 16:34
Цитата Сообщение от bullock Посмотреть сообщение
вот это может быть решением
ага
Цитата Сообщение от bullock Посмотреть сообщение
это совсем говнокод?
ага
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.07.2016, 16:34
Помогаю со студенческими работами здесь

Ostream и ofstream в качестве аргументов полиморфной функции
Здравствуйте! Перегрузил оператор &lt;&lt; с ostream и ofstream для пользовательского класса. ofstream &amp;operator &lt;&lt; (ofstream...

Возврат копии значения из функции
Сегодня нашел информацию о том, что можно сохранять ссылку на временный объект, например #include &lt;iostream&gt; int foo() { ...

Неправильный возврат значения функции
При компиляции если значение меньше или равно 100 программа прекращает работу а если значение выше 100 то работает нормально. ...

Возврат любого значения из функции
Здравствуйте, всем. есть функция принимающая массив char, она может вернуть любой тип данных, char или int. Но у меня не получается это...

Возврат значения через параметр функции
Пишу функцию,которая должна создавать динамическую матрицу,а затем возвращать ее через параметр. Правильно ли я понимаю,что для этого надо...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru