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

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

Войти
Регистрация
Восстановить пароль
 
FarStar
Заблокирован
#1

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

13.06.2013, 10:21. Просмотров 292. Ответов 8
Метки нет (Все метки)

Ну например, есть класс:
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++):

Создать абстрактный класс с общими полями и методами. В производных классах перегрузить чисто виртуальную функцию - общая стоимость всех изделий - C++
Помогите пожалуйста!!! Не могу правильно создать абстрактный класс! Создать абстрактный класс с общими полями и методами. В производных...

Класс: как обратиться к методу производного класса через итератор на базовый класс? - C++
Есть абстрактный и два порожденных. Хочу создать например list<Base*> list1; затем добавляю себе в список: ...

Как управлять наследниками через базовый класс - C++
Всем привет)Есть вот одна проблема. Хочу управлять объекты через другие объекты. Допустим есть базовый класс class base { ...

typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения - C++
Вот код: #include <iostream> #include <string> #include <conio.h> #include <windows.h> #include <typeinfo> using...

Как объявить функцию, которая имеет место быть только в некоторых дочерних классах, а базовый класс абстрактный? - C++
Как объявить функцию, которая имеет место быть только в некоторых дочерних классах? Например //Абстрактный базовый класс ...

Сложение объектов базового и наследуемых классов через виртуальную функцию - C++
Нужно определить базовый класс с виртуальной функцией сложения. Кроме того перегрузка этой же виртуальной функции должна складывать...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13133 / 7396 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
13.06.2013, 10:30 #2
Цитата Сообщение от FarStar Посмотреть сообщение
на данный момент созданных?
Хранить указатели на созданные экземпляры
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
Модератор
Эксперт CЭксперт С++
13133 / 7396 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
13.06.2013, 10:53 #4

Не по теме:

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


Еще не помешал бы в деструктор
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
13.06.2013, 10:55 #5
Croessmah,
Еще не помешал бы в деструктор
Зачем?
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
13.06.2013, 10:56 #6
Цитата Сообщение от FarStar Посмотреть сообщение
Как мне сделать так, чтоб я создал объект базового класса и при вызове в нём функции Test() она бы вызвалась во всех классах потомках, на данный момент созданных?
В общем случае никак
ибо класс ничего не знает о своих потомках (тем паче объектах)
или извращайся как посоветовал ForEveR
или измени условия задачи
Croessmah
Модератор
Эксперт CЭксперт С++
13133 / 7396 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 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
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
13.06.2013, 11:03 #8
Croessmah, Я тебя понял, да. Поменял, спасибо.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.06.2013, 14:01 #9
Очень похоже, что ТС неправильно понял задачу и напридумывал не пойми что. Мне вот почему-то на ум сразу приходит паттерн "компоновщик", со всеми вытекающими. Но, может быть, ТСу действительно нужен какой-то другой изврат.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2013, 14:01
Привет! Вот еще темы с ответами:

Управление объектом наследника через базовый класс - C++
Даны два класса. Класс A - базовый класс, B - класс наследник. В классе А 3 поля, в наследнике - еще 2. Указателю на класс A присвоим...

Написать функцию раньше мейна, через void. потом в мейне её вызывать - C++
Помогите. Нужно написать функцию раньше мейна, через void. потом в мейне её вызывать #include &lt;iostream.h&gt; #include &lt;cstdlib.h&gt; ...

Вызов виртуальной функции через указатель на базовый класс - C++
Всем привет! Помогите пожалуйста разобраться с вызовом виртуальной функции в программе. В моей программе требуется организовать класс...

Передача в контейнер объекта через указатель на базовый класс - C++
Передаю в stl контейнер list указатель на производный класс, предварительно приведя его к типу производного класса - программа вылетает.В...


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

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

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