Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2012, 11:43   #1
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию Наследование. Подводные камни.

Привет! Почему компилируется код:
Код:
#include <iostream>
using namespace std;
class A
{
public: 
	A() { cout<<"A";}
};
class B : public A
{
public :
		B()  { cout<<"B";}
};

int main()
{
	A *array[] = {new A, new B}; //(1)
	return 0;
}
Как я понимаю происходящее: в строке (1) создаём массив указателей на объекты класса A, и второй элемент инициализируется указателем на объект класса B. Почему нет ошибки соответствия типов?
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Старый 28.06.2012, 12:52   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Last
потому что восходящее приведение (uppercast) производится неявно, ибо дочерний класс можно использовать вместо базового
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 28.06.2012, 13:11   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Это не подводные камни, это и есть смысл наследования.
Потомки являются предками (ну, вы меня поняли) - их можно использовать так же, как будто они просто предки. Но не только, поскольку они еще и потомки.
Ваш вопрос на язык реальности можно приблизительно перевести так: "Почему я должен стоять в очереди с обычными человеками, если я - сотрудник МВД/Папа Римский/композитор Берлиоз/губернатор Южногорска/человек с двумя головами?"
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 28.06.2012, 14:01   #4
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Цитата:
Сообщение от Гром Посмотреть сообщение
Потомки являются предками (ну, вы меня поняли) - их можно использовать так же, как будто они просто предки. Но не только, поскольку они еще и потомки.
Нет, я вас не понял. От вашего приближения к реальности тоже не особо ясно стало =)

В принципе с сабжем разобрался, спасибо.
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Старый 28.06.2012, 20:59   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Если тебе нужно запретить неявное приведение типов, измени в своём коде:

class B : protected A

Студия скажет тебе, что то типа: "приведение существует, но не доступно"

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

Потомок, который отнаследовался через протектед - защищает предков. И тогда уже просто так приводить будет нельзя.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наследование Funny Студенточка Общие вопросы C/C++ 1 08.04.2012 21:46
наследование nika@ C# (си шарп) 0 18.03.2012 15:42
Наследование(С++) Igogo Помощь студентам 5 20.01.2012 20:07
Наследование Сергей089 Помощь студентам 6 07.02.2010 12:04
Подводные камни в операции += jojahti Общие вопросы C/C++ 5 27.08.2009 21:44