Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
TheThe
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 83
#1

Операция new для другого класса

23.07.2015, 16:13. Просмотров 853. Ответов 8
Метки нет (Все метки)

Здравствуйте. Есть вопрос.

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
...
class X
{
    public:
        virtual void pr()
        {
            cout<<"A";
        }
};
 
class Y : public X
{
    public:
        virtual void pr()
        {
            cout<<"B";
        }
};
int main ()
{
...
    X *x=new Y;
    x->pr();
...
    return 0;
}
Можете пояснить пожалуйста вот это строку:

X *x=new Y;

Это значит- Указателю на класс X вызываем конструктор класса Y ?? После этого указатель x будет ссылаться на класс Y, для чего так делают ? Если сразу можно сделать указатель на класс Y ??
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2015, 16:13
Ответы с готовыми решениями:

Функция-операция ввода для класса
Доброго времени суток. Создал класс First, для него определил функции-операции...

Передача метода класса в качестве параметра для метода другого класса
Здравствуйте, Передо мной стоит такая задача. Необходимо разработать механизм,...

Возможен ли класс для обработки объекта другого класса?
Решил написать приложение в кот больше 10 строк... Куча классов получилась,...

Вспомогательный класс для сокращения кода при создании другого класса
Добрый день. Есть код: template&lt;int floor&gt; struct Collection { ...

Объявление объекта класса fstream в качестве статической компоненты другого класса
Доброго времени суток. Есть задание, в котором говорится &quot;...Перепишите...

8
hoggy
Заблокирован
Эксперт С++
23.07.2015, 16:17 #2
Лучший ответ Сообщение было отмечено TheThe как решение

Решение

Цитата Сообщение от TheThe Посмотреть сообщение
Это значит- Указателю на класс X вызываем конструктор класса Y ?? После этого указатель x будет ссылаться на класс Y
ага.
Цитата Сообщение от TheThe Посмотреть сообщение
для чего так делают ? Если сразу можно сделать указатель на класс Y ??
наследников у базового класса может быть множество.
и все они реализуют свою версию
C++
1
virtual void pr()
вы обратили внимание:
C++
1
2
X *x=new Y;
x->pr(); //<--- какая версия функции была запущена?
вы сможете написать одну единственную функцию,
которая будет принимать указатель на базовый класс.

и скармливать ей любых потомков.
и эта функция сможет приводить в действие методы этих потомков.


это позволяет производить над объектами действия,
ничего не зная об их фактическом типе.
1
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
23.07.2015, 16:18 #3
TheThe, Тупо, чтобы показать, что хоть указатель и на объект класса X, благодаря виртуальности, будет вызвана функция pr класса Y.
1
TheThe
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 83
23.07.2015, 16:28  [ТС] #4
Цитата Сообщение от hoggy Посмотреть сообщение
ага.
Тогда ещё такой вопрос. После того, как будет выделена память, объект x останется объектном класса X, и может ли он, функционировать как если бы мы сделали вот так :
C++
1
X *x=new X;
.


Получается что это полноценный объект с выделенной памятью, которые может использовать все свои методы и свойства, НО, плюс ко всему ещё и может использовать виртуальные методы класса Y ??

Цитата Сообщение от ForEveR Посмотреть сообщение
Тупо, чтобы показать
Получается на практике такая запись места не найдет?
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
23.07.2015, 17:03 #5
Лучший ответ Сообщение было отмечено TheThe как решение

Решение

TheThe, Смысла особо нет. Может быть так:
C++
1
2
std::vector<X*> vec;
vec.push_back(new Y());
Может быть так:
C++
1
2
void f(X* p) { p->pr(); }
f(new Y());
Но создать в коде указатель на объект X, присвоив ему указатель на созданный объект класса Y, смысла особо нет.
1
hoggy
Заблокирован
Эксперт С++
23.07.2015, 17:11 #6
Лучший ответ Сообщение было отмечено TheThe как решение

Решение

Цитата Сообщение от TheThe Посмотреть сообщение
Тогда ещё такой вопрос. После того, как будет выделена память, объект x останется объектном класса X, и может ли он, функционировать как если бы мы сделали вот так :
C++
1
X* x = new Y; //<--- создаем объект класса Y
здесь была выделена память под объект Y.
и создан был именно объект класса Y.

указатель X* x содержит адрес объекта класса Y

объект x - это всего лишь указатель, который хранит адрес объекта Y.

когда вы попытаетесь получить доступ к объекту через указатель X* x,
компилятор будет думать что там - адрес объекта X.
он "забывает" о том, что по адресу на самом деле Y.

и вызывать вы сможете только те методы, которые были описаны в классе X.

однако, если они окажутся виртуальными, и будут переопределены в потомках,
то все равно будут запущены методы именно потомков, а не базового класса.

в этом и заключается суть виртуальных методов.

подсовывая указатель на базовый класс,
можно дергать функции наследников, если они - виртуальные.

Цитата Сообщение от TheThe Посмотреть сообщение
Получается что это полноценный объект с выделенной памятью, которые может использовать все свои методы и свойства, НО, плюс ко всему ещё и может использовать виртуальные методы класса Y ??
получается, что это - полноценный объект типа Y,
доступ к которому осуществляется через указатель на базовый класс.

и можно смело использовать любые функции, которые есть в базовом классе.
если они окажутся виртуальными - запустятся версии наследника.

Цитата Сообщение от TheThe Посмотреть сообщение
Получается на практике такая запись места не найдет?
получается, на практике подобные записи используются сплошь и рядом.
а сама технология - один из столбов, на котором держится ООП.
1
TheThe
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 83
23.07.2015, 17:18  [ТС] #7
Спасибо большое hoggy за разъяснения и ForEveR за примеры!
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
23.07.2015, 17:31 #8
Цитата Сообщение от hoggy Посмотреть сообщение
получается, на практике подобные записи используются сплошь и рядом.
Ну вот уж нет. Такая запись не используется сплошь и рядом.
C++
1
X* x = new Y();
ибо незачем, всегда можно написать
C++
1
Y* y = new Y();
, а послать его в функцию/вектор/куда-то еще как указатель на X.
1
hoggy
Заблокирован
Эксперт С++
23.07.2015, 17:56 #9
Цитата Сообщение от ForEveR Посмотреть сообщение
ибо незачем, всегда можно написать
с практической точки зрения,
нет смысла получать указатель на конкретного потомка,
что бы затем неявно кастить его к базе, и пихать туда,
где ожидается база.

Цитата Сообщение от ForEveR Посмотреть сообщение
послать его в функцию/вектор/куда-то еще как указатель на X.
в том то и дело, что именно это и есть основной юзкейс.
и как вы сами верно заметили - потребители ожидают указатель на базу.
и пихаем мы им так же указатель на базу:

C++
1
2
base* p = new Y;
foo(p);
C++
1
2
auto* p = new Y;
foo(p);
по факту во втором случае происходит неявное приведение типов.
но на практике это - монопенисуальный фактор,
который не имеет значения с т. з. архитектуры.

поэтому, оба варианта можно полагать равноценными.

---------------------------------------

а вот в ситуациях,
где реально необходимо знание о фактическом типе наследника,
уже не работают с базовым интерфейсом.
(я сейчас не рассматриваю всякого рода огороды с динамик_кастом и прочими костылями)

поэтому, запись вида:
C++
1
Y* p = new Y;
в некотором смысле избыточна,
если по смыслу нужен именно X*
1
23.07.2015, 17:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2015, 17:56

Как получить private переменную класса, функцей членом другого класса
Игра змейка: Есть класс поле в котором содержится размеры поля: class...

Приём константных векторов класса, как аргументов в методе другого класса
Есть такой класс: class Order { private: int numberOrder; map...

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем...


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

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

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