DG
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 3
1

Возможно ли? Базовый класс с чисто виртуальной функцией и наследники

27.12.2014, 18:17. Показов 1275. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть такая ситуация,
есть базовый класс и от него 2 наследника. У наследников есть одинаковые функции, но имеющие разный тип принимаемого и возвращаемого значения. Вопрос!!! Как описать чисто виртуальную функцию, что бы при вызове из мейна выполнялась функция, в зависимости от типа наследника
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
class BaseClass
{
public:
    virtual ... *someFunction(... *temp) = 0;
};
 
class Class1 : public BaseClass
{
public:
    string *someFunction(string *temp)
    {
        //что-то делаем
    };
};
 
class Class2 : public BaseClass
{
public:
    SomeClass *someFunction(SomeClass *temp)
    {
        //что-то делаем
    };
};
 
int main()
{
    string bb
        BaseClass *aa = new Class1;
        bb = *aa->someFunction(&bb);
}
Добавлено через 4 минуты
первое, что пришло на ум - это шаблоны, но не знаю как с реализацией. Первая проблема с которой столкнулся - как создать динамический объект. все что написал ниже может оказаться совершенно неверным, так как еще плохо знаком с шаблонами
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
template <class type>
class BaseClass
{
public:
    virtual type *someFunction(type *temp) = 0;
};
 
template <class type>
class Class1 : public BaseClass
{
public:
    string *someFunction(string *temp)
    {
        //что-то делаем
    };
};
 
template <class type>
class Class2 : public BaseClass
{
public:
    SomeClass *someFunction(SomeClass *temp)
    {
        //что-то делаем
    };
};
 
int main()
{
    BaseClass<string> *aa = new Class1<string>; //не хочет делать такое
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2014, 18:17
Ответы с готовыми решениями:

Создать абстрактный базовый класс с виртуальной функцией
Создать абстрактный базовый класс с виртуальной функцией – значением функций в заданной точке....

Создать абстрактный базовый класс Number с виртуальной функцией - норма
Создать абстрактный базовый класс Number с виртуальной функцией - норма. Создать производные классы...

В чем разница между виртуальной и чисто виртуальной функцией?
в чем разница между виртуальной и чисто виртуальной функцией? virtual void print(){..} virtual...

Создайте базовый абстрактный класс «Товар» с чистой виртуальной функцией вывода данных
Создайте базовый абстрактный класс «Товар» с чистой виртуальной функцией вывода данных. В этом...

3
Эксперт С++
1673 / 1045 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
27.12.2014, 18:26 2
Цитата Сообщение от DG Посмотреть сообщение
У наследников есть одинаковые функции, но имеющие разный тип принимаемого и возвращаемого значения.
Это какое-то новое и свежее представление об одинаковых функциях.
Цитата Сообщение от DG Посмотреть сообщение
Как описать чисто виртуальную функцию, что бы при вызове из мейна выполнялась функция, в зависимости от типа наследника
То есть, надо, чтобы main не зная, чью функцию вызывает, всё же сумел для разных случаев неизвестно как догадываться и передавать и принимать разные вещи?

Само существование такой потребности - бессмыслица. В данном случае требуется одно из двух. Первое - сделать функцию, которая принимает и возвращает одно и то же. Наследники будут выполнять преобразования в соответствии со своими нуждами. Второе - виртуальные функции не нужны, надо работать с различающимися типами, имеющими функции с разными сигнатурами.
1
DG
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 3
27.12.2014, 18:43  [ТС] 3
понял, спасибо.
0
Эксперт С++
8725 / 4305 / 958
Регистрация: 15.11.2014
Сообщений: 9,752
28.12.2014, 02:16 4
Лучший ответ Сообщение было отмечено DG как решение

Решение

Есть два варианта воможных решений.

1. Паттерн называется "система сообщений".

Суть: объекты разных классов подписываются на получения сообщений определенных типов.
В любой точке программы происходит "излучение сообщений в эфир". Это сообщение поймают и обработают все зарегистрировавшиеся в системе сообщений подписчики.

Пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct foo
{
    void ReadMessage(int msg) { cout <<"полученно сообщение типа int"; }
};
struct baz
{
    void ReadMessage(int msg) { cout <<"полученно сообщение типа int"; }
};
...
 
int main
{
   Foo f;
   Baz b;
 
   //указываем подписчиков сообщений
   EventSystem::Add<int>(f);
   EventSystem::Add<int>(b);
 
   //отправляем сообщение типа int. 
   //система сообщений доставит данное сообщение всем, кто подписался на тип int
   EventSystem::SendMessage(10);
}
2. Второй способ позволяет имитировать "шаблонно-виртуальную функцию".
Известно, что настоящую шаблоно-виртуальную функцию (то бишь в статике) реализовать невозможно.

Однако можно имитировать поведение:
C++
1
2
3
4
struct example
{
     virtual void* foo(void*);
};
Через void* можно передать все что угодно. Но это очень не безопасный способ.
Потому что здесь теряется проверка типов.

Давайте на секунду предположим, что есть волшебный механизм, который по смыслу такой же как void*, но при этом обеспечивает проверку типов и квалификаторов.

И вот тогда на сцену выходит механизм Arg:
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
#include "tools/arg.h"
 
...
 
struct base
{
     virtual Arg foo(Arg arg);
};
 
...
 
struct der: base
{
     virtual Arg foo(Arg arg)
     {
         if(arg.Is<int>())
         {
              int a = arg;
             cout<<"получен аргумент типа int "<< a;
         }
         else
            cout<<"получен аргумент:" << arg;
     }
};
 
...
 
int main()
{
     der d;
     base& i = d;
 
     i.foo(10); //<--- Arg , что аргумент , как const int
}
Механизм Arg запоминает ссылки любых типов.
А потом, при извлечении данных из Arg, выполняет проверку типов и квалификаторов.

Таким образом получаем тот же самый void*, только безопасное.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.12.2014, 02:16
Помогаю со студенческими работами здесь

Создать абстрактный базовый класс Figure с виртуальной функцией Периметр. Создать производные классы Rectangle
Создать абстрактный базовый класс Figure с виртуальной функцией -периметр.Создать производные...

Создать абстрактный базовый класс с виртуальной функцией - Объем. Создать производные классы: Пирамида, Шар со своими функциями объема
Создать абстрактный базовый класс с виртуальной функцией - Объем. Создать производные классы:...

Создать абстрактный базовый класс "Фигура" с виртуальной функцией: "Площадь"
Создать абстрактный базовый класс фигура с виртуальной функцией — площадь. Создать производные...

Абстрактный базовый класс "звонок" с виртуальной функцией "стоимость"
Помогите пожалуйста очень надо (классы это не мое) полиморфизм Поступающие звонки оператор...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru