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

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

Войти
Регистрация
Восстановить пароль
 
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
#1

Как явно преобразовать указатель? - C++

27.08.2013, 18:19. Просмотров 635. Ответов 9
Метки нет (Все метки)

Здравствуйте!

Изучая возможности наследования столкнулся со следующим утверждением: "Если для объекта производного класса объявить какой-то метод, который не принадлежит базовому классу, то невозможно получить доступ к этому методу, используя указатель на базовый класс, если только этот указатель не будет явно преобразован в указатель производного класса. Всегда можно преобразовать любой указатель базового класса в указатель производного класса".
Вот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std; 
 
class One
{
};
 
class Two : public One
{
public:
    void func() {cout << "\n0(-_o)0\n";}
};
 
int main()
{
One * ptr = new Two;
//(*ptr).Two::func();
return 0;
}
Каким образом можно, преобразовав указатель, вызвать функцию func()?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2013, 18:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как явно преобразовать указатель? (C++):

Преобразовать указатель одного типа в указатель другого. - C++
Всем привет. Мне нужно выполнить задание &quot;Преобразовать указатель одного типа в указатель другого. &quot; Что-то совсем не понимаю. Помогите...

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

Как преобразовать указатель на класс к указателю на асбтрактный класс? - C++
Но тут есть одна тонкость- два промежуточных класса. Вот код, надеюсь всё из него понятно. #include &lt;stdio.h&gt; ...

Преобразовать указатель в float - C++
допустим есть такая структура struct lol { int a; float b; } ololo; ololo.a = 34; ololo.b = 2.5; wchar_t *pt...

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void sort_1(const...

Расскажите, как здесь работает указатель на указатель? - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;locale.h&gt; using namespace std; void main() { setlocale(LC_ALL, &quot;rus&quot;); ...

9
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
27.08.2013, 18:33 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
class One {
};
 
class Two : public One {
 public:
  void func() {
    std::cout << "\n0(-_o)0\n";
  }
};
 
int main(int, char**) {
  One * ptr = new Two;
  // лучше так
  static_cast<Two*>(ptr)->func();
  // можно так
  ((Two*)ptr)->func();
  return 0;
}
1
Убежденный
Ушел с форума
Эксперт С++
15708 / 7219 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
27.08.2013, 18:49 #3
Правильный способ - использовать dynamic_cast.
Он умеет проверять тип указателя/ссылки во время выполнения программы, и
возвращает NULL/бросает исключение, если объект на самом деле не является
производным классом.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
27.08.2013, 18:50 #4
Цитата Сообщение от Убежденный Посмотреть сообщение
Правильный способ - использовать dynamic_cast.
dynamic_cast применяется для полиморфных типов.
0
Убежденный
Ушел с форума
Эксперт С++
15708 / 7219 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
27.08.2013, 19:07 #5
В примере топикстартера подразумевается наличие виртуальных методов, иначе работать с
производными классами через указатель или ссылку на базу не имеет смысла.
0
Kuzia domovenok
2078 / 1907 / 176
Регистрация: 25.03.2012
Сообщений: 6,576
Записей в блоге: 1
27.08.2013, 19:58 #6
Цитата Сообщение от Убежденный Посмотреть сообщение
В примере топикстартера подразумевается наличие виртуальных методов
где?

Добавлено через 1 минуту
Цитата Сообщение от Убежденный Посмотреть сообщение
иначе работать с
производными классами через указатель или ссылку на базу не имеет смысла.
совсем нет. Он же кастует указатели. А после каста вполне может вызывать любые методы, хоть виртуальные, хоть нет или вообще (как в примере) методы, которых нет в базовом!
0
Убежденный
Ушел с форума
Эксперт С++
15708 / 7219 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
27.08.2013, 20:57 #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Он же кастует указатели. А после каста вполне может вызывать любые методы, хоть виртуальные, хоть нет или вообще (как в примере) методы, которых нет в базовом!
Ну и в чем смысл такого (в отсутствии виртуальных методов) ?
0
zer0mail
2383 / 2014 / 201
Регистрация: 03.07.2012
Сообщений: 7,258
Записей в блоге: 1
27.08.2013, 21:40 #8
Цитата Сообщение от Убежденный Посмотреть сообщение
Ну и в чем смысл такого (в отсутствии виртуальных методов) ?
Вопрос, конечно, интересный. Даже 2 вопроса:
1. Будет ли это работать
2. Зачем это надо

Если мы работаем как с объектами базового класса, так и с объектами прозводных классов. И у нас есть потребность добавить новые методы в базовый класс (но доступа к нему и прочим наследникам нет). Тогда делаем своего наследника, добавляем в нем методы и используем для базового ( и для "чужих" наследников). Т.е. этот метод нам полезен и он мог бы быть в базовом классе (все необходимые данные там есть), но его там нет...

Чисто для примера: базовый класс двусвязный список и куча наследников, есть метод "получить следующий объект". А метода "получить предыдущий" нет...
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
28.08.2013, 02:34 #9
Цитата Сообщение от Убежденный Посмотреть сообщение
В примере топикстартера подразумевается наличие виртуальных методов
Согласен. Но подобный пример с dynamic_cast скорее всего даже не скомпилируется потому что нет полиморфизма, поэтому и написал
0
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
28.08.2013, 20:06  [ТС] #10
Спасибо, что помогли разобраться!
0
28.08.2013, 20:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2013, 20:06
Привет! Вот еще темы с ответами:

Почему указатель на указатель объявляется как float **A; - C++
Почему float?

Как можно явно вызвать оператор преобразования? - C++
Доброго времени суток Как можно явно вызвать такой оператор преобразования? struct CL { template &lt;class A, class B, class...

Как освободить память занимаемую вектором и явно вернуть системе? - C++
Здравствуйте! Вопрос: Как освободить память занимаемую вектором и явно вернуть системе?

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив) - C++
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая как параметр получает указатель на...


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

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

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