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

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

Войти
Регистрация
Восстановить пароль
 
helloy
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 46
#1

Имитация виртуальных вызовов с применением оператора dynamic_cast - C++

26.12.2013, 23:38. Просмотров 275. Ответов 4
Метки нет (Все метки)

Представьте, что виртуальных функций не существует, и измените пример так, чтобы виртуальные вызовы имитировались с применением оператора dynamic_cast.
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
#include <iostream>
using namespace std;
enum note { middleC, Csharp, Cflat }; // Etc.
 
class Instrument {
public:
  virtual void play(note) const {
    cout << "Instrument::play" << endl;
  }
  virtual char* what() const {
    return "Instrument";
  }
  // Assume this will modify the object:
  virtual void adjust(int) {}
};
 
class Wind : public Instrument {
public:
  void play(note) const {
    cout << "Wind::play" << endl;
  }
  char* what() const { return "Wind"; }
  void adjust(int) {}
};
 
class Percussion : public Instrument {
public:
  void play(note) const {
    cout << "Percussion::play" << endl;
  }
  char* what() const { return "Percussion"; }
  void adjust(int) {}
};
 
class Stringed : public Instrument {
public:
  void play(note) const {
    cout << "Stringed::play" << endl;
  }
  char* what() const { return "Stringed"; }
  void adjust(int) {}
};
 
class Brass : public Wind {
public:
  void play(note) const {
    cout << "Brass::play" << endl;
  }
  char* what() const { return "Brass"; }
};
 
class Woodwind : public Wind {
public:
  void play(note) const {
    cout << "Woodwind::play" << endl;
  }
  char* what() const { return "Woodwind"; }
};
 
// Identical function from before:
void tune(Instrument& i) {
    i.play(middleC);
}
 
// New function:
void f(Instrument& i) { i.adjust(1); }
 
// Upcasting during array initialization:
Instrument* A[] = {
  new Wind,
  new Percussion,
  new Stringed,
  new Brass,
};
 
int main() {
  Wind flute;
  Percussion drum;
  Stringed violin;
  Brass flugelhorn;
  Woodwind recorder;
  tune(flute);
  tune(drum);
  tune(violin);
  tune(flugelhorn);
  tune(recorder);
  f(flugelhorn);
} ///:~
это как? нужно использовать шаблоны?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2013, 23:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Имитация виртуальных вызовов с применением оператора dynamic_cast (C++):

Составить программу вычисления с применением условного оператора - C++
u=\begin{cases} {x}^{2}-3, &amp; x &lt; 0 \\ x, &amp; x \geq 0 \end{cases}

Составить программу вычисления с применением условного оператора - C++
u = \begin{cases} {x}^{2}+|x-8|, &amp; x &lt; 8 \\ {x}^{3}+4x-5, &amp; x \geq 8 \end{cases}

Составить программу вычисления с применением условного оператора. M=max {a,b,c} - C++
#include &lt;iostream.h&gt; int main() { float x,y,z,A,B; cout&lt;&lt;(&quot;Введите x, y, z: &quot;); cin&gt;&gt;x&gt;&gt;y&gt;&gt;z; A=x+y+z; ...

Что делаю не так? Составить программу вычисления с применением условного оператора - C++
Составить программу вычисления с применением условного оператора. Все данные в правых частях формул выбрать самостоятельно и ввести с...

Составить программы для пузырьковой сортировки и сортировки посредством выбора с применением оператора while - C++
Доброго времени суток, очень нужна ваша помощь в решении данной проблемы, буду бесконечно благодарен. Составить программы для пузырьковой...

dynamic_cast - C++
Помогите разобраться с dynamic_cast, а точнее с вот этой записью void f() { A* pa = new A; B* pb = new B; void* pv =...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
26.12.2013, 23:46 #2
dynamic_cast можно использовать только с полиморфными классами, т.е. без виртуальных функций он работать просто не будет (компилятор не позволит). Странное какое-то задание
helloy
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 46
27.12.2013, 00:10  [ТС] #3
может кто знает, как решить?)

Добавлено через 14 минут
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
27.12.2013, 12:13 #4
helloy, В данной формулировке задачу решить невозможно. Как минимум виртуальным должен быть деструктор.
helloy
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 46
27.12.2013, 17:33  [ТС] #5
думаю это опечатка dynamic_cast->static_cast
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
#include <iostream>
using namespace std;
enum note { middleC, Csharp, Cflat }; // Etc.
 
class Instrument {
public:
   void play(note) const {
    cout << "Instrument::play" << endl;
  }
   char* what() const {
    return "Instrument";
  }
  // Assume this will modify the object:
  void adjust(int) {}
};
 
class Wind : public Instrument {
public:
  void play(note) const {
    cout << "Wind::play" << endl;
  }
  char* what() const { return "Wind"; }
  void adjust(int) {}
};
 
class Percussion : public Instrument {
public:
  void play(note) const {
    cout << "Percussion::play" << endl;
  }
  char* what() const { return "Percussion"; }
  void adjust(int) {}
};
 
class Stringed : public Instrument {
public:
  void play(note) const {
    cout << "Stringed::play" << endl;
  }
  char* what() const { return "Stringed"; }
  void adjust(int) {}
};
 
class Brass : public Wind {
public:
  void play(note) const {
    cout << "Brass::play" << endl;
  }
  char* what() const { return "Brass"; }
};
 
class Woodwind : public Wind {
public:
  void play(note) const {
    cout << "Woodwind::play" << endl;
  }
  char* what() const { return "Woodwind"; }
};
 
// Identical function from before:
template <class T>
void tune(Instrument& i) {
        static_cast<T*>(&i)->play(middleC);
}
 
// Upcasting during array initialization:
Instrument* A[] = {
  new Wind,
  new Percussion,
  new Stringed,
  new Brass,
};
 
int main() {
  Wind flute;
  Percussion drum;
  Stringed violin;
  Brass flugelhorn;
  Woodwind recorder;
  tune<Wind>(flute);
  tune<Percussion>(drum);
  tune<Stringed>(violin);
  tune<Brass>(flugelhorn);
  tune<Woodwind>(recorder);
 
} ///:~
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2013, 17:33
Привет! Вот еще темы с ответами:

dynamic_cast - C++
#include &lt;iostream&gt; class B { public: virtual void foo(){std::cout&lt;&lt;&quot;B&quot;;} private: int a; }; class D : public B { ...

dynamic_cast - C++
Уважаемые, подскажите теорию. Как устроен данный каст? Не нашел его определений. В студии он зашит в библиотеку, подсказок в хелпе про него...

Dynamic_cast - C++
#include &lt;iostream&gt; #define STOP cin.get(); using std::cin; using std::cout; class A { public: // void foo()

dynamic_cast - C++
Подскажите пожалуйста, возникла проблема. Есть базовый клас CStep. И пока один наследник: class CStepMove : public CStep Ести вектор...


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

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

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