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

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

Войти
Регистрация
Восстановить пароль
 
DrobyshevAlex
1169 / 1119 / 16
Регистрация: 31.05.2012
Сообщений: 3,059
#1

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

15.06.2013, 15:00. Просмотров 777. Ответов 12
Метки нет (Все метки)

Предположим есть класс
C++
1
2
3
4
5
class A
{
    char a;
    void foo();
};
можно ли делать так

C++
1
2
3
4
5
6
7
8
class B: public A
{
    void bar();
}
 
A* a = new A;
B* b = (B*)a;
b->bar();
то есть объект b не создавался, но класс B не содержит свойств, только методы для работы с полями класса А.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2013, 15:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Приведение типа к другому классу (C++):

Объяснить, что происходит в коде (приведение одного типа указателей к другому?) - C++
char* a = "Hell"; int* b =(int*) a; cout << *b; Как я понимаю в этом кусочке кода происходит преобразование одного типа...

Приведение одного парметра-типа к другому разыменованному парметру-типу (указателю) в шаблонах - C++
Здравствуйте! изучаю C++, и есть такой вопрос, можно ли при инстанцировании, допустим, шаблонной функции привести один параметр-тип к...

Типы классу. Приведение. С++ - C++
Для приведения от пользовательского типа в основной тип используется: 1. Перегруженный оператор = 2. Конструктор с одним параметром ...

Передача переменной из цикла другому классу - C++
Есть цикл, каждое новое значение переменной нужно передавать в метод др. класса. Никак не пойму как это реализовать

Приведение переменной к другому типу - C++
float a = (float)x; // старый стиль float b = static_cast<float>(y); // современный стиль разве по старому не удобнее? почему...

Наследование: как передать массив одного класса другому классу? - C++
Доброе время суток, нужна помощь. Не могу сотворить чудо. Сомневаюсь уже во всём. Как передать массив одного класса другому классу? Дабы...

12
Desu_Is_A_Lie
62 / 62 / 3
Регистрация: 26.02.2012
Сообщений: 114
15.06.2013, 16:30 #2
В данном случае проблем не будет. Впрочем, это игры с огнём. Как только у B появятся виртуальные методы всё сломается.
1
DrobyshevAlex
1169 / 1119 / 16
Регистрация: 31.05.2012
Сообщений: 3,059
15.06.2013, 16:43  [ТС] #3
Цитата Сообщение от Desu_Is_A_Lie Посмотреть сообщение
Как только у B появятся виртуальные методы всё сломается.
Не появятся. Если появятся, переделаю

Суть в чём. Есть класс, и у него несколько тысяч объектов. Все одинаковые поля содержат и методы.
Но есть несколько десятков объектов с определённым типом, которым нужно дополнительные провеки.
И ещё несоклько десятков, которым нужны тоже дополнительные, но другие.
Вот я и решил, может стоит сделать наследников, и только в них описать эти методы, а потом делать что то типа

C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
...
    B* ToB() { return m_type == TYPE_B ? (B*)this : NULL; }
    C* ToC() { return m_type == TYPE_C ? (C*)this : NULL; }
...
};
if (B* b = a->ToB())
    b->foo();
if (C* c = a->ToC())
    c->bar();
если нужны будут дополнительные поля или виртуальные методы, тогда переделаю, но пока не вижу надобности в них. Ну кроме того что деструктор виртуальный у класса A.
На вид пока всё работает
0
0x10
2479 / 1652 / 248
Регистрация: 24.11.2012
Сообщений: 4,095
15.06.2013, 16:51 #4
Явно проблема архитектуры, лучше переделать.
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.06.2013, 16:57 #5
для таких дел обычно виртуальные функции и делают. если появляется наследник, в котором скажем какая-то особая проверка, то метод проверки делается виртуальным. не надо никаких кастов и проверок на то, что это тот тип, для которого нужно специальную проверку делать.
0
0x10
2479 / 1652 / 248
Регистрация: 24.11.2012
Сообщений: 4,095
15.06.2013, 17:00 #6
В крайнем случае, если проверка предполагает действительно различные действия в зависимости от конкретного типа объекта, можно запилить Visitor (http://ru.wikipedia.org/wiki/%D0%9F%...BD%D0%B8%D1%8F).
0
DrobyshevAlex
1169 / 1119 / 16
Регистрация: 31.05.2012
Сообщений: 3,059
15.06.2013, 17:10  [ТС] #7
Давайте не будем обсуждать, что нужно делать копирование данных в другой ДЦ в случае наводнения...
Понятно что если будут свойства дополнительные, то будет проблема с памятью.

Вопрос был в том, будет ли такая проблема при условиях описанных в посте 1
Это чисто теоретический вопрос в рамках познания с++
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
15.06.2013, 23:41 #8
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
можно ли делать так
Cтандарт говорит, что в этом случае результат приведения типов не определен.

C++2003, 5.2.9.8 Static cast, 5.4.5 Explicit type conversion.
0
DrobyshevAlex
1169 / 1119 / 16
Регистрация: 31.05.2012
Сообщений: 3,059
16.06.2013, 00:50  [ТС] #9
Ну чисто теоретически, под метод же не будет память выделятся, а значит даже такая запись, без наследования
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A
{
    int a, b;
    A:A(): a(10), b(5) {}
    int foo() { return a + b; }
}
 
class B
{
    int a, b;
    int bar() { return a - b; }
}
 
A* a = new A;
B* b = (B*)a;
b->bar(); // вернёт 5
по идеи
То етсь в примере с первого поста всё должно работать.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.06.2013, 01:58 #10
Цитата Сообщение от DrobyshevAlex Посмотреть сообщение
а значит даже такая запись, без наследования
Такого рода преобразования (а в данном случае это аналог reinterpret_cast) машинно-зависимы, т.е. не переносимы. Незначительные изменения в структуре класса (хотя бы даже поменять местами a,b) приведут к другому результату.
0
DrobyshevAlex
1169 / 1119 / 16
Регистрация: 31.05.2012
Сообщений: 3,059
16.06.2013, 02:15  [ТС] #11
Цитата Сообщение от Tulosba Посмотреть сообщение
хотя бы даже поменять местами a,b
Я это понимаю Я и пишу, что именно в ТАКОМ виде
0
Desu_Is_A_Lie
62 / 62 / 3
Регистрация: 26.02.2012
Сообщений: 114
16.06.2013, 09:27 #12
Цитата Сообщение от Tulosba Посмотреть сообщение
машинно-зависимы, т.е. не переносимы. Незначительные изменения в структуре класса (хотя бы даже поменять местами a,b) приведут к другому результату.
Нет тут ничего машинно-зависимого, и изменение расположения а,б тут тоже ничего не изменит. Всё покрыто стандартом по этому поводу.

Собственно, нарыл даже вопрос на СО с выдержками из стандартов C/C++: http://stackoverflow.com/questions/2...they-were-decl
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.06.2013, 11:20 #13
Desu_Is_A_Lie, я имел в виду изменить в одном из классов, а не в обоих.
0
16.06.2013, 11:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2013, 11:20
Привет! Вот еще темы с ответами:

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

Полиморфизм, наследование и приведение экземпляров класса одного к другому - C++
Есть некий класс со своими переменными,его экземпляр занимает какое-то количество памяти. Интерфейс выглядит примерно так: /*...

Приведение LPVOID к классу "непостоянной" величины - C++
В поток посылаю экземпляр класс : userThread = CreateThread(NULL, NULL, ConnectionShell, (LPVOID)(&userCurrent), NULL, NULL); Где...

Конструкторы, приведение типа и ошибка "Не найден оператор, принимающий правый операнд типа 'char *'" - C++
#include <stdio.h> class A { int somemember; public: A(){printf("A()\n");} A(char*){printf("A(char*)\n");} ...


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

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

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