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

Как преобразовать указатель на класс к указателю на асбтрактный класс? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ что такое for(;;) http://www.cyberforum.ru/cpp-beginners/thread818678.html
что значит цикл for(;;)?
C++ Простейший текстовый редактор стандартными средствами c++ Доброго времени суток. Есть задание написать простейший графический редактор. Наподобие блокнота в wnidows. Сделать его в визуальных средах не составляет особого труда. А мне бы хотелось написать все ручками. Так вот вопрос. Какими библиотеками для этого стоит пользоваться и с какой стороны лучше подойти к этой задаче. В гугле искал информацию, ничего толкового не нашел. Везде рассказывается про... http://www.cyberforum.ru/cpp-beginners/thread818672.html
Шифрование "Лозунговым методом" (кому интересно) C++
Вот работа была сделал -> делюсь:) #include <stdio.h> #include <conio.h> #include <string.h> #include <locale.h> //Шифрование лозунговым методом void uncodetext(char arr1, char arr2, char arr3); const int N = 100; char A="abcdefghijklmnopqrstuvwxyz", output, untext, A2="abcdefghijklmnopqrstuvwxyz";
Выражение с суммами C++
Необходимо посчитать выражение с 2-мя суммами a+Ʃ(2*l^3+3*l^2+1) 2+Ʃ(k^2+2) для l от 2 до n и k от 3 до m вот, что получилось у меня #include <stdio.h> #include <math.h> #define N 100 int main() {
C++ Подпрограммы в программе http://www.cyberforum.ru/cpp-beginners/thread818630.html
Добрый день! помогите пожалуйста добработать программу, что бы на начальном экране при запуске появлялось меню подпрограмм 1.titulnaia ramka 2.arifmeticheckie virazheniaя 3.vetvleniaя 4.massivi 5. matrichiя 6.rachet treugolnika 7.funkchia 8.exit
C++ Вычислить прощадь фигуры Как узнать площадь заштрихованной фигуры в C++ ? Необходимые данные ввести самостоятельно. подробнее

Показать сообщение отдельно
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438

Как преобразовать указатель на класс к указателю на асбтрактный класс? - C++

26.03.2013, 02:35. Просмотров 389. Ответов 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
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
#include <stdio.h>
//++++++++++++++++++++++++++++++
 
class base  {
 public:
   virtual void f ()= 0;     
};
 
//+++++++++++++++++++++++++++++++
 
class pr_0: public base  {
// public:
//   void f ()= 0;     
};
 
//+++++++++++++++++++++++++++++++
 
class pr_1: public base  {
// public:
//   void f ()= 0;     
};
 
 
//+++++++++++++++++++++++++++++++
 
class rez: public pr_0,pr_1  {
 public:
   void f (){;};     
};
 
//+++++++++++++++++++++++++++++++
 
int main () {
 
 rez* p= new  rez; 
 
 
 //ПРОБЛЕМА В ЭТОМ УЧАСТКЕ КОДА. Я должен писать либо так,
 //либо base* b= (base*)(pr_0*)p, меж тем мне абсолютно  
 //всё равно через какой из интерфейсов (pr_0 или pr_1)  
 //я получу указатель на base. Ведь через указатель на   
 //base я смогу вызвать единственную функцию- f; она      
 //объявлен в base, реализована в rez, два транзитных    
 //интерфейса имеют к ней отношение как свинья к         
 //апельсинам. Тем не менее, надо их учесть, а смысл? Они
 //в эту функцию не привносят ничего нового, она через них 
 //транзитом идёт просто и всё.                          
 
 base* b= (base*)(pr_1*)p;
 
 //Вот так к сожалению писать нельзя, а хотелось бы. Чтобы
 //при взгляде на код было ясно: мне всё равно через какой
 //из интерфейсов pr_0 или pr_1 я получаю указатель на
 //base                     
 
 //base* b= (base*)p;
 
 b->f(); 
 
 
 getchar ();
 return 0;
}
ВЫ мне можете возразить: код слишком демонстрационный и компилятор не может учесть все фантазии пользователей. Согласен, тут pr_0 и pr_1 даром не нужны. Можно просто наследовать rez от base и всё. Что же, можно добавить в код практичности. Например, объявить в каждом из интерфейсов pr_0 и pr_1 по чистой виртуальной функции,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//+++++++++++++++++++++++++++++++
 
class pr_0: public base  {
 public:
  virtual void f_0 ()= 0;     
};
 
//+++++++++++++++++++++++++++++++
 
class pr_1: public base  {
 public:
  virtual void f_1 ()= 0;     
};
а реализовать их в rez. Просто я этого делать не стал, дабы не загромождать код. В этом случае проблема также остаётся актуальной и надуманной- ведь хоть наши интерфейсы теперь "полезные" (содержат объявления функций), они по прежнему не имеют отношения к f. Но тем не менее их надо учитывать при приведении типа! Смысл? f-то всё равно ОДНА!

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