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

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

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

Указатель на объект базового класса и адрес объекта производного класса - C++

16.11.2014, 23:24. Просмотров 658. Ответов 1
Метки нет (Все метки)

Пример кода:
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
27
28
29
class Class1
{
public:
    Class1(int x) {
        j = new int;
        *j = x;
    }
    ~Class1() {delete j;}
    int* j;
};
 
class derClass1 : public Class1
{
public:
    derClass1(int y) : Class1(4) {
        k = new int;
        *k = y;
    }
    ~derClass1() {delete k;}
    int* k;
};
 
void main()
{
    Class1* a = new Class1(2);
    Class1* b = new derClass1(7);
    delete a;
    delete b;
}
1. Оператор new возвращает адрес на инициализированный объект класса derClass1. Этот адрес мы присваиваем указателю на объект другого, базового, класса (строка 26). Тут происходит какое-то приведение типов указателей, которое мне не понятно. Может ли кто-нибудь прояснить суть процесса?
Что интересно, если описать производный класс в таком виде:
class derClass1 : private Class1,
то приведение типов не срабатывает и присвоение невозможно.

2. Применяется ли такое приведение типов указателей на практике? Где это может понадобиться?

3. Правильно ли я понял, что при выполнении delete b область памяти, выделенная под k, останется неосвобожденной? Ведь указатель b после приведения указывает на объект базового класса, у которого нет полей и методов производного класса, хотя при операции new derClass1 память выделялась также и под k.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2014, 23:24     Указатель на объект базового класса и адрес объекта производного класса
Посмотрите здесь:
Создание полиморфного объекта, зачем создавать указатель на объект базового класса? C++
C++ Создать копию объекта производного класса зная указатель на базовый
Конструкторы базового и производного класса C++
Вызов методов производного класса из базового C++
C++ Объекты производного класса не наследуют методы базового
Наследование: почему вызывается метод базового класса, а не производного? C++
Можно ли из базового класса обратится к виртуальному методу производного? C++
Как узнать тип производного класса в функции базового C++
Вызов виртуального метода базового класса из указателя производного C++
C++ Статический указатель класса на объект этого же класса
Указателю на базовый класс присвоить адрес производного класса C++
Вызов метода производного класса через указатель на базовый класс C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mss307
118 / 118 / 25
Регистрация: 14.12.2013
Сообщений: 352
16.11.2014, 23:46     Указатель на объект базового класса и адрес объекта производного класса #2
1. Указатель на тип базового класса при открытом наследовании может хранить адрес объекта производного класса.
2. Да. Например, это подходит для хранения указателей или ссылок в контейнере.
3. Совершенно верно, деструктор производного класса не будет вызван. Проблема кроется в деструкторе базового класса. Его необходимо сделать виртуальным, тогда будет выполнено динамическое связывание,и деструктор будет вызван не в соответствии с типом указателя,а в соответствии с типом объекта, адрес которого хранит указатель.
Yandex
Объявления
16.11.2014, 23:46     Указатель на объект базового класса и адрес объекта производного класса
Ответ Создать тему
Опции темы

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