Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
CEBEP
107 / 107 / 23
Регистрация: 21.03.2010
Сообщений: 445
#1

Приведение к типу-наследнику - C++

30.03.2014, 20:52. Просмотров 1840. Ответов 22
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
class A {
};
class B: public A {
    void foo() const { std::cout << "some is king of every fish"; }
};
int main() {
    A* pointer(new B);
    static_cast<B*>(static_cast<void*>(pointer))->foo();
    return 0;
}
Можите на пальцах объяснить, как, без каких бы то ни было проверок, без дополнительных вычислений на этапе выполнения вызвать метод foo класса B для объекта, указатель на который хранится, как указатель на А? Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2014, 20:52
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Приведение к типу-наследнику (C++):

ООП. Динамическое приведение типа от родителя к наследнику
Добрый день, коллеги. Проблема в следующем. Есть два библиотечных класса...

Приведение к типу
В чем разница? static_cast&lt;int&gt;(a); и (int)a

Приведение к типу (uint8 *)
Разбирая чужой код, наткнулся на такую вот конструкцию uint8 * ...

Приведение к базовому типу
#include &lt;iostream&gt; using namespace std; class A{ public: ...

Приведение переменной к другому типу
float a = (float)x; // старый стиль float b = static_cast&lt;float&gt;(y); //...

Приведение void* указателя к типу
struct tParamStruct { const char* Result; }; tParamStruct ParamStruct; ...

22
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
30.03.2014, 22:41 #21
Цитата Сообщение от CEBEP Посмотреть сообщение
там же речь о множественном наследовании и приведении типов к базовым. тут не имеет места ни такой вид наследования не такая ориентация приведения...
Товарищ zss написал, что я абсолютно не прав. Эта ссылка пруф того, что я прав, т.к. я говорил про общий случай. И про то, что у reinterpret_cast нет в данной ситуации никаких преимуществ перед static_cast, зато появляются минусы, если появляется такой тип наследования.
0
CEBEP
107 / 107 / 23
Регистрация: 21.03.2010
Сообщений: 445
30.03.2014, 22:44  [ТС] #22
Цитата Сообщение от DrOffset Посмотреть сообщение
какая необходимость делать каст через void*
Интересно. Был уверен, что на static_cast<B*>(pointer) компилятор ругается... сейчас убедился, что это не так... Так намного легче, спасибо
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
30.03.2014, 22:54 #23
Цитата Сообщение от CEBEP Посмотреть сообщение
Так намного легче, спасибо
Именно. Я к этому вел с самого начала. Каст через void* к тому же обеспечит те же проблемы с множественным наследованием (пусть его нет в данном случае, но игнорировать этот факт нельзя), про которые я говорил. Каст через void* заблокирует способность static_cast вывести правильный адрес при преобразовании база->наследник, т.к. void* уже не несет информации о типе.

Добавлено через 4 минуты
CEBEP, есть целая техника, основанная на таком касте (база->наследник), может быть интересно на будущее.
1
30.03.2014, 22:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2014, 22:54
Привет! Вот еще темы с решениями:

Приведение указателя на void к другому типу?
в поиске смотрел - не помогло! Возникла проблемка: В книге сказано, что...

Приведение void* к типу указателя на структуру
Тема обсуждалась здесь, но решения так и нет нормального Есть два (и более,...

Приведение пользовательского типа к типу int
Написан класс DateTime и перегружены его операторы, в частности ввод/вывод в...

Приведение двух классов к типу друг друга
Всем добрый день, Прошу вашей помощи с пониманием принципов работы...


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

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

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