Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Abdullah
0 / 0 / 0
Регистрация: 16.11.2014
Сообщений: 1
1

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

16.11.2014, 23:24. Просмотров 1366. Ответов 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.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2014, 23:24
Ответы с готовыми решениями:

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса
Класс В является производным от класса А. Определить обработчик исключительной...

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого...

Почему объект производного класса не видит префиксный оператор из базового класса?
Короче создал я базовый класс с перегруженным префиксным оператором ++. Потом...

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток...

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса?
я хотел так, но программа просто падает void Student::add(Base** head) {...

1
mss307
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
16.11.2014, 23:46 2
1. Указатель на тип базового класса при открытом наследовании может хранить адрес объекта производного класса.
2. Да. Например, это подходит для хранения указателей или ссылок в контейнере.
3. Совершенно верно, деструктор производного класса не будет вызван. Проблема кроется в деструкторе базового класса. Его необходимо сделать виртуальным, тогда будет выполнено динамическое связывание,и деструктор будет вызван не в соответствии с типом указателя,а в соответствии с типом объекта, адрес которого хранит указатель.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2014, 23:46

Создание полиморфного объекта, зачем создавать указатель на объект базового класса?
Зачем создавать указатель на объект базового класса: Base *A = new Derived...

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

Создание указателя типа базового класса на экземпляр производного класса
Добрый день! Иногда видел коды, где создавался указатель типа базового класса...


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

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

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