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

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

Восстановить пароль Регистрация
 
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
26.03.2013, 02:35     Как преобразовать указатель на класс к указателю на асбтрактный класс? #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
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-то всё равно ОДНА!

Спасибо кто откликнется.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2013, 02:35     Как преобразовать указатель на класс к указателю на асбтрактный класс?
Посмотрите здесь:

C++ как удалить объект по указателю на базовый класс?
C++ создание объекта произвольного класса по указателю на базовый класс
Указателю на базовый класс присвоить адрес производного класса C++
C++ Дано описание следующего класса class TPoint ... Как описывается указатель на данный класс
C++ Как использовать перегруженный оператор [ ], если дан не сам класс, а указатель на него?
C++ Указатель на класс как поле класса
C++ Как в функции my_function преобразовать ссылку на базовый класс в ссылку на класс B или С
Как проверить на какой класс ссылается указатель? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.03.2013, 03:00     Как преобразовать указатель на класс к указателю на асбтрактный класс? #2
Цитата Сообщение от kravam Посмотреть сообщение
//Вот так к сожалению писать нельзя, а хотелось бы. Чтобы
*//при взгляде на код было ясно: мне всё равно через какой
*//из интерфейсов pr_0 или pr_1 я получаю указатель на
*//base * * * * * * * * * *
//base* b= (base*)p;
виртуальное наследование

Цитата Сообщение от kravam Посмотреть сообщение
//Вот так к сожалению писать нельзя, а хотелось бы. Чтобы
*//при взгляде на код было ясно: мне всё равно через какой
*//из интерфейсов pr_0 или pr_1 я получаю указатель на
*//base
а вообще тут без вариантов - только через pr_0 ибо он наследуется публично
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
01.04.2013, 16:03  [ТС]     Как преобразовать указатель на класс к указателю на асбтрактный класс? #3
Исследуем дальше. Оказывается через какой класс pr_0 или pr_1 находить указатель на base- большая разница

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 base* b;
 
 b= (pr_0*)p;
 printf ("%x\n", b);
 //То же что и
 b= (base*)(pr_0*)p;
 printf ("%x\n", b);
 
 //+++++++++++++++++++++++++++++++
 
 b= (pr_1*)p;
 printf ("%x\n", b);
 //То же что и
 b= (base*)(pr_1*)p;
 printf ("%x\n", b);
данные разнятся.

Если в base объявить функцию, а определить её в rez и потом вызвать, вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 base* b;
 
 b= (pr_0*)p;
 printf ("%x\n", b);
 
 b= (base*)(pr_0*)p;
 printf ("%x\n", b);
 b-> f(); 
 
 b= (pr_1*)p;
 printf ("%x\n", b);
 
 b= (base*)(pr_1*)p;
 printf ("%x\n", b);
 b-> f();
то всё ж таки функция будет вызвана одна и та же. Это наталкивает на мысль, что вроде как получать указатель на base есть разница, но вроде как и нет (тело f ведь одно и то же). Пусть каждый интерпретирует как хочет, я лишь даю голые факты.
Yandex
Объявления
01.04.2013, 16:03     Как преобразовать указатель на класс к указателю на асбтрактный класс?
Ответ Создать тему
Опции темы

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