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

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

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

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

16.11.2014, 23:24. Просмотров 968. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на объект базового класса и адрес объекта производного класса (C++):

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

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

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

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

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

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

1
mss307
118 / 118 / 25
Регистрация: 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
Привет! Вот еще темы с ответами:

Вызов объектом базового класса функцию из производного класса! - C++
Как можно осуществить вызов или передачу значения в базовый класс для дальнейшего вычисления этого значения в производном классе. Вот...

Создать копию объекта производного класса зная указатель на базовый - C++
Добрый день! Вопрос в следующем... Возможно ли создать копию объекта производного класса зная указатель на базовый класс? У меня получился...

Конструкторы базового и производного класса - C++
class first { public: first(int a):first(a){} void Setfirst(int a){first=a;} int Getfirst(){return first;} private: ...

Вызов методов производного класса из базового - C++
Возможно ли, чтобы class A { void f1() { f2();//если вызвано из B, то вызывается B::f2(), а не A::f2() } void f2(){} }


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

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

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