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

Как через базовый класс вызывать виртуальную функцию во всех потомках? - C++

Восстановить пароль Регистрация
 
FarStar
Заблокирован
13.06.2013, 10:21     Как через базовый класс вызывать виртуальную функцию во всех потомках? #1
Ну например, есть класс:
C++
1
2
3
4
5
6
7
class BATYANA
{
     BATYANA();
     virtual ~BATYANA();
 
     virtual int Test();
}
и есть куча классов потомков от BATYANA, типа
C++
1
2
3
4
5
6
7
8
class SINOK : public BATYANA
{
     SINOK();
     ~SINOK();
 
     int Test();
 
}
Как мне сделать так, чтоб я создал объект базового класса и при вызове в нём функции Test() она бы вызвалась во всех классах потомках, на данный момент созданных?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2013, 10:21     Как через базовый класс вызывать виртуальную функцию во всех потомках?
Посмотрите здесь:

C++ typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения
C++ Как управлять наследниками через базовый класс
Как объявить функцию, которая имеет место быть только в некоторых дочерних классах, а базовый класс абстрактный? C++
C++ Написать функцию раньше мейна, через void. потом в мейне её вызывать
Создать абстрактный класс с общими полями и методами. В производных классах перегрузить чисто виртуальную функцию - общая стоимость всех изделий C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,909
Записей в блоге: 2
Завершенные тесты: 1
13.06.2013, 10:30     Как через базовый класс вызывать виртуальную функцию во всех потомках? #2
Цитата Сообщение от FarStar Посмотреть сообщение
на данный момент созданных?
Хранить указатели на созданные экземпляры
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.06.2013, 10:47     Как через базовый класс вызывать виртуальную функцию во всех потомках? #3
Это изврат вообщем-то...

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
#include <iostream>
#include <vector>
#include <algorithm>
 
class Father
{
public:
   Father()
   {
   }
   template<typename Derived>
   Father(Derived* der)
   {
      deriveds.push_back(der);
   }
   virtual ~Father() {}
   virtual void print() const
   {
      call();
   }
   static void erase(Father* f)
   {
       auto pos = std::find(deriveds.begin(), deriveds.end(), f);
       if (pos != deriveds.end())
       {
           deriveds.erase(pos);
       }
   }
private:
   static void call()
   {
      std::for_each(deriveds.begin(), deriveds.end(), [](const Father* p)
      {
         p->print();
      });
   }
   static std::vector<Father*> deriveds;
};
 
std::vector<Father*> Father::deriveds;
 
class Derived : public Father
{
public:
   Derived() : Father(this) {}
   ~Derived() { erase(this); }
   void print() const
   {
      std::cout << "Derived" << std::endl;
   }
};
 
int main()
{
   Derived d1, d2, d3, d4;
   Father p;
   p.print();
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,909
Записей в блоге: 2
Завершенные тесты: 1
13.06.2013, 10:53     Как через базовый класс вызывать виртуальную функцию во всех потомках? #4

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Это изврат вообщем-то...
это транслит же?
Цитата Сообщение от ForEveR Посмотреть сообщение
call();


Еще не помешал бы в деструктор
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.06.2013, 10:55     Как через базовый класс вызывать виртуальную функцию во всех потомках? #5
Croessmah,
Еще не помешал бы в деструктор
Зачем?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
13.06.2013, 10:56     Как через базовый класс вызывать виртуальную функцию во всех потомках? #6
Цитата Сообщение от FarStar Посмотреть сообщение
Как мне сделать так, чтоб я создал объект базового класса и при вызове в нём функции Test() она бы вызвалась во всех классах потомках, на данный момент созданных?
В общем случае никак
ибо класс ничего не знает о своих потомках (тем паче объектах)
или извращайся как посоветовал ForEveR
или измени условия задачи
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,909
Записей в блоге: 2
Завершенные тесты: 1
13.06.2013, 11:02     Как через базовый класс вызывать виртуальную функцию во всех потомках? #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Зачем?
C++
1
2
3
4
5
6
7
8
9
10
11
12
void foo(){
    Derived errorObjects[100];//После выхода из функции, указатели на эти объекты остаются в векторе
}
 
 
int main()
{
   Derived d1, d2, d3, d4;
   Father p;
    foo();
   p.print();
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.06.2013, 11:03     Как через базовый класс вызывать виртуальную функцию во всех потомках? #8
Croessmah, Я тебя понял, да. Поменял, спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2013, 14:01     Как через базовый класс вызывать виртуальную функцию во всех потомках?
Еще ссылки по теме:

Создание объекта через указатель на базовый абстрактный класс C++
C++ Вызов виртуальной функции через указатель на базовый класс
Вызов метода производного класса через указатель на базовый класс C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.06.2013, 14:01     Как через базовый класс вызывать виртуальную функцию во всех потомках? #9
Очень похоже, что ТС неправильно понял задачу и напридумывал не пойми что. Мне вот почему-то на ум сразу приходит паттерн "компоновщик", со всеми вытекающими. Но, может быть, ТСу действительно нужен какой-то другой изврат.
Yandex
Объявления
13.06.2013, 14:01     Как через базовый класс вызывать виртуальную функцию во всех потомках?
Ответ Создать тему
Опции темы

Текущее время: 15:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru