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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
pi_X_el
Заблокирован
17.02.2013, 10:48     Указателю на базовый класс присвоить адрес производного класса #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 Point
{
public:
    Point(float a=0, float b=0)         { x=a; y=b; }
protected:
    float x;
    float y;
};
 
 
class Circle : public Point
{
public:
    Circle(float a, float b, float r)   :Point(a,b)  { radius=r; }
protected:
    float radius;
};
 
 
 
int main()
{
    Point   *pointPtr, p(3.5, 5.3);
    Circle  *circlePtr, c(2.7, 1.2, 8.9);
    
    pointPtr = &c;   // Как такое возможно??
 
    return 0;
}
Сам смысл такого присваивания не совсем понятен. Это ведь разные классы.
Не могли бы мне объяснить почему так можно делать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2013, 10:48     Указателю на базовый класс присвоить адрес производного класса
Посмотрите здесь:

C++ Как удалить объект по указателю на базовый класс?
C++ Создать копию объекта производного класса зная указатель на базовый
C++ Создание объекта произвольного класса по указателю на базовый класс
Как инициализировать элементы данных производного класса через базовый? C++
Задача (разъяснение) в алгоритм (программа, используя базовый и производный классы, создавала массив объектов типа производного класса) C++
C++ Присвоить Указателю адрес из массива Char
C++ Разработать производный от абстрактного класса Figure класс и класс, производный от производного
C++ Как лучше присвоить указателю на указатель адрес массива
Указатель на объект базового класса и адрес объекта производного класса C++
Присвоить указателю конкретный адрес C++
Вызов метода производного класса через указатель на базовый класс C++
C++ Класс: как обратиться к методу производного класса через итератор на базовый класс?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
17.02.2013, 13:22     Указателю на базовый класс присвоить адрес производного класса #2
pi_X_el, инкапсуляция, наследование, полиморфизм. Что-нибудь про это слышали?
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
17.02.2013, 16:19     Указателю на базовый класс присвоить адрес производного класса #3
Объясняю:
Открытое наследование описывает связь между классами, которая называется не иначе как "класс наследник - суть разновидность класса базового". Посему, все то, что верно для базового класса, верно и для наследника, но не наоборот. Т.е. если у тебя есть класс Person, а классы Student, Teacher, Director от него наследует, ты можешь работать с массивом указателей на Person (которые по факту содержат адреса объектов, которые в твоей программе описывают студентов, директоров или учителей), таким образом вызывая функции, которые актуальны для всех классов в твоей программе, которые относятся к человеку вообще. Т.е. ты вызываешь для них функцию "Dance" и они танцуют, кем бы ни были.

Почитай полиморфизм, как советовали выше. И да, моделировать круг, как наследника точки по меньшей мере не корректно. Правило: "класс наследник - суть разновидность класса базового". Едва ли ты можешь утверждать, что круг - разновидность точки. Здесь больше подойдет вложение (агрегация)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Student s("Mishanya");
Teacher t("Klavdia");
Director d("Sofokl");
 
Person* persons[3];
persons[0] = &s;
persons[1] = &t;
persons[2] = &d;
 
for(int i = 0; i < 3; i++)
{
    persons[i]->Dance();
}
Yandex
Объявления
17.02.2013, 16:19     Указателю на базовый класс присвоить адрес производного класса
Ответ Создать тему
Опции темы

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