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

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

Войти
Регистрация
Восстановить пароль
 
Нитонисе
8 / 8 / 2
Регистрация: 12.10.2013
Сообщений: 247
#1

Как изменить тип объекта, на который указывает указатель? - C++

03.12.2013, 18:30. Просмотров 638. Ответов 5
Метки нет (Все метки)

Есть абстрактный базовый класс и два производных:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Base
{
protected:
int A;
};
 
class Child1 : public Base
{
private:
int B;
};
 
class Child2 : public Base
{
private:
int C;
};
Допустим я работаю с экземпляром класса Child1, но в какой-то момент времени мне нужно изменить тип объекта на Child2 с сохранением данных в защищенной части базового класса (переменная int A) и уничтожением данных в защищенной части производного класса (переменная int B).

C++
1
2
Base *ptrBase = new Child1();
//... что-то делаем, перенаправляя указатель на Child2
Как это сделать?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2013, 18:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как изменить тип объекта, на который указывает указатель? (C++):

Как создать копию объекта на который указывает указатель - C++
У меня есть указатель класс Student, который хранит информацию о студентах(имя, фамилию, телефон) в строках в стиле Си, то есть private...

Как вывести адресс на который указывает указатель типа char*. - C++
Эта программа : #include <iostream> using namespace std; int main() { int a={1, 2, 3, 4}; int* g=a; cout<<g<<endl; ...

Узнать номер элемента массива на который указывает указатель - C++
Может вопрос глупый но тока что об этом задумался! Можно ли узнать номер элемента массива на который указывает указатель не используя...

Тип на который указывает итератор - C++
Как в функции узнать тип на который указывает итератор не используя auto и boost::iterator_value?#include <iostream> #include <vector> ...

Узнать тип, на который указывает итератор - C++
Всем привет! Вот например у меня есть такой код: vector<double> objInt2; objInt2.push_back(1); objInt2.push_back(2); ...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,847
03.12.2013, 18:36 #2
Цитата Сообщение от Нитонисе Посмотреть сообщение
Допустим я работаю с экземпляром класса Child1, но в какой-то момент времени мне нужно изменить тип объекта на Child2
тип объекта ни как не поменяешь
он уже существует и меняться не собирается
есть объект Вася и он ни как не поменяется на объект Таня
а вот указатель может поменять значение
указывал на Васю укажет на Таню
но в памяти должны присутствовать оба объекта
0
Нитонисе
8 / 8 / 2
Регистрация: 12.10.2013
Сообщений: 247
03.12.2013, 18:46  [ТС] #3
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот указатель может поменять значение
Ну это-то понятно. Но тогда же придется все данные из области protected базового класса (а данных там много и они нужны) переносить в новый объект? Вариант не очень подходящий.

А вот как меняют типы данных?
C++
1
2
int a;
double b = (double)a;
Изменили тип объекта а. Думал что-то подобное и в моем случае может получиться.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,847
03.12.2013, 18:50 #4
Цитата Сообщение от Нитонисе Посмотреть сообщение
Ну это-то понятно. Но тогда же придется все данные из области protected базового класса (а данных там много и они нужны) переносить в новый объект? Вариант не очень подходящий.
ничего не попишешь
новый объект ничего не знает про старый
ему нужно сообщить
для этого существуют конструкторы копирования и переопределяют присвоение
в твоем случае можно сделать так
конструктор копирования в базовом классе
C++
1
2
Base *ptrBase1 = new Child1();
Base *ptrBase2 = new Child2(*ptrBase1 );
1
Нитонисе
8 / 8 / 2
Регистрация: 12.10.2013
Сообщений: 247
03.12.2013, 18:58  [ТС] #5
Цитата Сообщение от ValeryS Посмотреть сообщение
в твоем случае можно сделать так
конструктор копирования в базовом классе
Да, видимо так и придется делать. Похоже я изначально выбрал неудачную структуру программы, что возникает такая необходимость.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,847
03.12.2013, 19:09 #6
Цитата Сообщение от Нитонисе Посмотреть сообщение
А вот как меняют типы данных?
никак
Цитата Сообщение от Нитонисе Посмотреть сообщение
double b = (double)a;
здесь создается новый объект b и ему присваиватся значение объекта a(а поскольку он не проинициализирован значение- мусор)
считай(условно) это тот же конструктор копирования
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2013, 19:09
Привет! Вот еще темы с ответами:

Ошибка:выражение должно представлять собой указатель на полный тип объекта - C++
Доброго времени суток! Простенький код, но не получается. using namespace std; #include<iostream> int main() { int c1; ...

Создать абстрактный тип данных (структура) - вектор, который имеет указатель на short и число элементов - C++
Создать абстрактный тип данных (структура) - вектор, который имеет указатель на short и число элементов. Определить функции: инициализации,...

Создать абстрактный тип данных (структура) — вектор, который имеет указатель на int и число элементов - C++
Создать абстрактный тип данных (структура) - вектор, который имеет указатель на int и число элементов. Определить функции: инициализации,...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.12.2013, 19:09
Ответ Создать тему
Опции темы

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