Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
#1

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

26.03.2013, 02:35. Просмотров 414. Ответов 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-то всё равно ОДНА!

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

Привести указатель на класс к указателю на void - C++
Хай #pragma once #include &quot;list.h&quot;; #include &quot;Print.h&quot;; class Robot { public:

Как в функции my_function преобразовать ссылку на базовый класс в ссылку на класс B или С - C++
Всем привет, как в функции my_function преобразовать ссылку на базовый класс в ссылку на класс B или С ? class A { public: A(); ...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

Как удалить объект по указателю на базовый класс? - C++
Допустим есть несколько классов: // абстрактный класс - введен для управления наследниками class A{ ... } // рабочий класс...

Указатель на класс как поле класса - C++
Как работать с указателем в классе class A {}; class B {private: A * uk}; // как с ним работать?

Как проверить на какой класс ссылается указатель? - C++
То есть допустим есть базовый класс class A и производные class B:public A; class C:public A; также есть ссылка A *s; ...

2
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 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 ибо он наследуется публично
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
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 ведь одно и то же). Пусть каждый интерпретирует как хочет, я лишь даю голые факты.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2013, 16:03
Привет! Вот еще темы с ответами:

Указателю на базовый класс присвоить адрес производного класса - C++
class Point { public: Point(float a=0, float b=0) { x=a; y=b; } protected: float x; float y; };

Создание объекта произвольного класса по указателю на базовый класс - C++
Есть некий абстрактный базовый класс . Мы знаем , что от этого базового класса будет образовано несколько конкретных производных классов...

Присвоение указателю на базовый класс адреса производного класса - C++
Когда наследую как public,всё норм,как private - ошибка. Как сделать тогда,чтобы открылся конструктор? Base :: Base(); Не помогает ...

Как использовать перегруженный оператор [ ], если дан не сам класс, а указатель на него? - C++
Это указатель на класс figure *f Это перегрузка оператора void figure::operator (int i) { cout &lt;&lt; &quot;(&quot; &lt;&lt; massiv.x &lt;&lt; &quot;,&quot; &lt;&lt;...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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