0 / 0 / 0
Регистрация: 16.11.2014
Сообщений: 1
1

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

16.11.2014, 23:24. Показов 4221. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2014, 23:24
Ответы с готовыми решениями:

Возможно ли указатель производного класса инициализировать объектом базового класса?
имеется связка наследуемых классов A->B а от B наследуются одновременно еще два класса B->C и B->D...

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

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

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

1
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
16.11.2014, 23:46 2
1. Указатель на тип базового класса при открытом наследовании может хранить адрес объекта производного класса.
2. Да. Например, это подходит для хранения указателей или ссылок в контейнере.
3. Совершенно верно, деструктор производного класса не будет вызван. Проблема кроется в деструкторе базового класса. Его необходимо сделать виртуальным, тогда будет выполнено динамическое связывание,и деструктор будет вызван не в соответствии с типом указателя,а в соответствии с типом объекта, адрес которого хранит указатель.
1
16.11.2014, 23:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2014, 23:46
Помогаю со студенческими работами здесь

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

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

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

Указатель на объект базового класса
Добрый вечер, форумчане. Имеется функция, которая находит в бинарном дереве(сортируемом по id)...

Указатель на объект базового класса
Есть класс Автор с полями фамилия, год рождения и пол и есть второй класс Книга с полями название,...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru