Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
16 / 0 / 2
Регистрация: 10.11.2012
Сообщений: 117

Унаследовать функцию с переменным числом параметров

24.08.2016, 11:19. Показов 2845. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, форум!

Вот такая задачка:
Есть базовый класс A с методом
C++
1
void func(void)
. От этого класса унаследовался другой класс, B, в котором есть тоже функция func, но с другим набором входных параметров
C++
1
void func(int, int)
.

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

Я наверное выражаюсь как Кличко, но надеюсь что вы меня поняли.

Заранее благодарю вас за помощь!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.08.2016, 11:19
Ответы с готовыми решениями:

Написать функцию с переменным числом параметров
Задание дали такое: Написать функцию с переменным числом параметров, в соответствии с вариантом, продемонстрировать вызов функции с...

Реализовать функцию с переменным числом параметров C++
Реализовать функцию с переменным числом параметров. Параметрами являются символы, определяющие, какие функции должны быть выполнены....

Массивы в функцию с переменным числом параметров
Как передать некоторое кол-во массивов в функцию с переменным числом параметров и вывести в функции сумму элементов каждого массива (на...

11
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
24.08.2016, 11:24
Цитата Сообщение от krazyd Посмотреть сообщение
и мог бы вызвать соответствующую функцию func у потомков.
Вы явно что-то не то делаете. Какую задачу Вы хотите решить таким методом?
0
2393 / 1921 / 763
Регистрация: 27.07.2012
Сообщений: 5,562
24.08.2016, 11:28
С одинаковым именем функции такое не прокатит. В базовом создать функции func для различного числа параметров и соответствующие им виртуальные функции virtual_func, которые и будут там вызываться. А в производных классах реализовать эти виртуальные функции.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.08.2016, 11:42
Цитата Сообщение от krazyd Посмотреть сообщение
Мне нужно как-то изменить метод func в базовом классе, чтобы он смог принимать разное кол-во разнотипных аргументов и мог бы вызвать соответствующую функцию func у потомков.
есть 3 решения вашей проблемы.

1.
самый лучший вариант:
пересмотреть свои взгляды на жизнь,
и перестать страдать хренью.

судя по формулировке вашего запроса,
сейчас вы решаете XY проблему:
http://rus.stackexchange.com/q... xy-problem

но это сработает только если вы - моральный человек.

если аморальный, читайте дальше:

2.
продвинутые извращенцы пользуют механизмы навроде std::any
http://en.cppreference.com/w/cpp/utility/any

3.
этот изысканный способ только для конченных извращенцев настоящих ценителей:
можно воспользоваться функциями-элипсисами.
http://www.cplusplus.com/reference/cstdarg/va_arg/
1
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347
24.08.2016, 11:53
Цитата Сообщение от hoggy Посмотреть сообщение
судя по формулировке вашего запроса,
сейчас вы решаете XY проблему:
http://rus.stackexchange.com/q... xy-problem
вот из-за таких, как вы, поисковики так и не научились искать инфу.
Потому что пишешь в гугле вопрос, он находит похожий на форуме... А вместо ответа там написано "вы не то решаете".
0
24.08.2016, 11:59

Не по теме:

Взял себе в рамочку на рабочий стол

есть 3 решения вашей проблемы.
1.
самый лучший вариант:
пересмотреть свои взгляды на жизнь,
и перестать страдать хренью.

0
24.08.2016, 12:02

Не по теме:

PS: Поисковики не умеют - потому что не ИИ

0
16 / 0 / 2
Регистрация: 10.11.2012
Сообщений: 117
24.08.2016, 12:08  [ТС]
HelicopterK52, я в своей программе должен пользоваться только неким классом PRIME, в котором есть указателем на базовый класс A. В метод этот этого класса передается индекс, по которому определяется режим работы программы. В зависимости от этого режима работы программы, внутреннему указателю на базовый класс присваивается тот или иной потомок. Но подьзователь видит только одну функцию func класса PRIME и передает в нее все необходимые аргументы для соответствующего режима работы программы.

Как-то так.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
24.08.2016, 13:02
Лучший ответ Сообщение было отмечено hoggy как решение

Решение

Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
А вместо ответа там написано "вы не то решаете".
Может это и не ответ на вопрос ТС, но, скажем так, вариация на тему.
Кликните здесь для просмотра всего текста
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <utility>
#include <tuple>
 
template <typename F>
struct ArgumentPack;
 
struct Argument
{
public:
    template <typename F, typename Derived>
    void try_to_dispatch(Derived & x, F (Derived::*fp)) const
    {
        auto pack = dynamic_cast<ArgumentPack<F> const *>(this);
        if(pack)
        {
            pack->dispatch(x, fp);
        }
        else
        {
            std::cout << "Viable function not found!\n";
        }
    }
    
    virtual ~Argument()
    { }
};
    
template <typename ...Args>
struct ArgumentPack<void (Args...)>
    : Argument, std::tuple<Args...>
{
    using std::tuple<Args...>::tuple;
 
    template <typename Derived, typename F>
    void dispatch(Derived & x, F (Derived::*fp)) const
    {
        dispatch(x, fp, std::make_index_sequence<sizeof...(Args)>{});
    }
        
private:
    template <typename Derived, typename F, size_t ...Indexes>
    void dispatch(Derived & x, F (Derived::*fp), std::index_sequence<Indexes...>) const
    {
        (x.*fp)(std::get<Indexes>(*this)...);
    } 
};
 
 
class Base
{
public:
    template <typename ...Args>
    void func(Args && ...args)
    {
        Argument const & a = ArgumentPack<void(Args...)>(std::forward<Args>(args)...);
        func(a);
    }
 
protected:
    virtual void func(Argument const &) = 0;
};
 
 
class Derived
    : public Base
{
public:
    void func(int a, char b)
    {
        std::cout << "a: " << a << " b: " << b << std::endl;
    }
 
private:
    void func(Argument const & args) override
    {
        args.try_to_dispatch<void(int, char)>(*this, &Derived::func);
    }
};
 
 
int main()
{
    Base * d1 = new Derived();
 
    d1->func(1, '2'); // dynamic arguments call
    
    Derived * d2 = new Derived();
    
    d2->func(1, '2'); // normal call
    
    
    delete d1;
    delete d2;
}
http://rextester.com/AKLW78695

Идея простая - пытаемся вычислить соответствие сигнатуре, которую задал пользователь при вызове функции базового класса, в наследнике.
В реальности подобное, впрочем, достаточно редко пригождается, поэтому ты и получаешь такой ответ.
2
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.08.2016, 13:44
Цитата Сообщение от DrOffset Посмотреть сообщение
Идея простая - пытаемся вычислить соответствие сигнатуре, которую задал пользователь при вызове функции базового класса, в наследнике.
шикарный диспетчер!

*утащил код в копилку всякого изврата мудрости*
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.08.2016, 13:46
Цитата Сообщение от krazyd Посмотреть сообщение
void func()
Цитата Сообщение от krazyd Посмотреть сообщение
void func(int, int)
Заменить на что-то вроде:
C++
1
void func(const std::vector<int>& params);
Не?
Ну или переходить от ООП подхода к шаблонному...
0
-12 / 3 / 0
Регистрация: 02.04.2012
Сообщений: 347
24.08.2016, 13:51
DrOffset, благодарю за ответ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.08.2016, 13:51
Помогаю со студенческими работами здесь

Написать функцию с переменным числом параметров
Написать функцию с переменным числом параметров, которая считае значение полинома вида: c0 + c1*x + c2*x^2 + c3*x^3 + ... Напишите код,...

Написать функцию с переменным числом параметров
Среднее арифметическое из элементов в списке параметров , стоящие на четных местах. вот что у меня получилось, дальше никак: #include...

Реализовать функцию с переменным числом параметров
Помогите пожалуйста. Аргументы функции: целые положительные числа. Конец ввода: -1. Возвращаемое значение: максимальное из...

Написать функцию min с переменным числом параметров
Написать функцию min с переменным числом параметров, которая находит минимальное из чисел типа int или из чисел типа double, тип параметров...

В функцию с переменным, числом параметров передать массивы целых чисел
#include &lt;iostream&gt; void main() { void func(int k, ...); int x = { 15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru