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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 55, средняя оценка - 4.93
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
#1

Наследуются ли конструкторы и деструкторы? - C++

02.06.2009, 14:54. Просмотров 7679. Ответов 124
Метки нет (Все метки)

При наследовании происходит ли наследование конструкторов и деструкторов базового класса?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2009, 14:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследуются ли конструкторы и деструкторы? (C++):

Наследуются ли конструкторы? - C++
Привет. Хочу спросить, если базовый класс имеет открытый конструктор по умолчанию, то при открытом наследовании будет ли создан...

Почему не наследуются конструкторы? - C++
Здравствуйте. Гугл говорит, что конструкторы в C++ унаследовать никак нельзя. Почему так? В чём проблема с их наследованием? Хотел...

Конструкторы и деструкторы - C++
Помогите, пожалуйста, исправить программу и закончить ее как надо. Необходимо реализовать класс с двумя полями, имеющими имена first и...

Конструкторы и деструкторы - C++
Здравствуйте уважаемые программисты, помогите пожалуйста новичку? Не могу разобраться в программе, где смог там написал комментарий и то не...

Конструкторы и деструкторы - C++
Не понимаю, как закончить программу. Написала конструктор и деструктор, хотя он тут и не нужен по идее. Но по заданию сделала. А как...

Конструкторы и деструкторы - C++
Необходимо реализовать класс с двумя полями, имеющими имена first и second. Обязательно должны присутствовать: Для инициализации...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
14.01.2016, 23:51 #91
Цитата Сообщение от mporro Посмотреть сообщение
В рамках стандарта С++, да.
Цитата Сообщение от mporro Посмотреть сообщение
меня как специалиста в области проектирования объектных систем, гораздо больше пользы, чем слово из стандарта.
Мы находимся в разделе C++ и обсуждаем C++.
Документ, который определяет язык и всё с ним связанное - стандарт языка.
Для прораба на стройке, объект - это вообще стройка. И ему не важно что там пишет Мейер.
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
14.01.2016, 23:56 #92
Цитата Сообщение от mporro Посмотреть сообщение
В рамках стандарта С++, да. Но для меня это утверждение из стандарта является абсурдным.
Цитата Сообщение от mporro Посмотреть сообщение
для меня как специалиста
mporro, неверие в стандарт С++ сильно подрывает вашу репутацию как "специалиста". И одно тут сильно противоречит другому, мне кажется!
0
hoggy
Нарушитель
6588 / 2769 / 476
Регистрация: 15.11.2014
Сообщений: 6,112
Завершенные тесты: 1
14.01.2016, 23:59 #93
Цитата Сообщение от mporro Посмотреть сообщение
В рамках стандарта С++, да. Но для меня это утверждение из стандарта является абсурдным.
Второе предложение противоречит первому.
У Вас всё в какую-то кашу перемешалось.

Цитата Сообщение от mporro Посмотреть сообщение
Согласно Бертрану Мейеру, поддерживающему идиологию классов, кстати, объект -- это некоторое верное значение абстрактного типа данных, описываемого классом.
тезис никак не противоречит специфике с++
Цитата Сообщение от mporro Посмотреть сообщение
И это определение имеет для меня как специалиста в области проектирования объектных систем, гораздо больше пользы, чем слово из стандарта.
Боюсь, что как специалист по части с++,
вы вызываете серьёзные опасения по части вашей компетенции.
На протяжении всей этой темы вы генерировали ляп за ляпом,
обнажая своё невежество по части этого языка.
0
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
15.01.2016, 00:08 #94
Цитата Сообщение от Croessmah Посмотреть сообщение
мы находимся в разделе C++ и обсуждаем C++.
Документ, который определяет язык и всё с ним связанное - стандарт языка.
А я не спорю!
Но стандарт интересен для определения операционной семантики языка, а не для попыток определения терминов.
Бессмысленно потрясать договором со словами "ООО<Си и Плюс-Плюс>, именуемый далее поставщик" для определения слова поставщик, да её и утверждений, что любое ООО -- это поставщик.

У наследования объектов есть ясное определение. Если любое сообщение, корректное для типа A, корректно обрабатывается и типом B, то B наследует A. Абстрактный тип выражается классом. Объект -- верное значение абстрактного типа. Наследуется ли конструктор? Нужно узнать, если обрабатывает ли B корректно сообщение для A. Вот здесь нужен стандарт! Это будет вопрос именно C++! Обрабатывает или нет. Если нет -- не наследуется. Если да -- наследуется. Но что там внутри себя стандарт называет наследованием -- деталь, в которую мы вообще не должны лезть.

Если программист унаследует машину от руля, мотивируя тем, что так оно вытекает из стандарта C++, он всё равно получит тикет назад, и денег за работу не увидит, потому что машина рулём не является.


Цитата Сообщение от ct0r Посмотреть сообщение
мы в разделе С++, а не Теория и практика программирования, вот в чем фишка
Никто не рассуждает о JavaScript...
Вопрос прост: если есть класс A и от него унаследован класс B, то верно ли, что для каждого конструктора A, В корректно обрабатывает эквивалентные сообщения?
Выясняется, насколько я понимаю, что нет. Мы должны явно делегировать вызов внутреннему объекту A либо написав эквивалентный конструктор, либо явно обратившись к агрегату A. Значит эти конструкторы не унаследованы.

В каком-нибудь PHP это будет не так. В последних версиях там конструкторы именно наследуются. И в разделе PHP, можно было бы сказать: да, конструкторы наследуются.
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
15.01.2016, 00:12 #95
Цитата Сообщение от mporro Посмотреть сообщение
Если любое сообщение, корректное для типа A, корректно обрабатывается и типом B, то B наследует A.
У конструктора нет имени. Послать отсутствующее сообщение? Круть.
0
hoggy
Нарушитель
6588 / 2769 / 476
Регистрация: 15.11.2014
Сообщений: 6,112
Завершенные тесты: 1
15.01.2016, 00:15 #96
Цитата Сообщение от mporro Посмотреть сообщение
Вопрос прост: если есть класс A и от него унаследован класс B, то верно ли, что для каждого конструктора A, В корректно обрабатывает эквивалентные сообщения?
тоже самое, только по-русски.

при этом пожалуйста, не используйте формулировок
вроде "конструктор А не против пацифизма".
потому что конструктору глубоко фиолетовы
все эти ваши гуманитарные фантазии.
0
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
15.01.2016, 00:18 #97
Цитата Сообщение от Mr.X Посмотреть сообщение
неверие в стандарт С++ сильно подрывает вашу репутацию как "специалиста"
Стандарт C++ никак не может определять какие-либо высокоуровневые понятия. Такие как наследование или объект. Если бы мы занимались вопросами реализации С++ и зашла бы дискуссия о том, нужно ли агрегировать базовый объект или можно просто делегировать вызов разделяемому объекту, если объект базового класса иммутабельный, то стандарт ответил бы нам, что мы должны, как минимум, агрегировать все свойства.

Можно свободно подвергать сомнению мою компетентность на форуме.
0
hoggy
Нарушитель
6588 / 2769 / 476
Регистрация: 15.11.2014
Сообщений: 6,112
Завершенные тесты: 1
15.01.2016, 00:18 #98
Цитата Сообщение от mporro Посмотреть сообщение
Если любое сообщение, корректное для типа A, корректно обрабатывается и типом B, то B наследует A.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <event>
struct A: event::listen<int> {
    void readMessage(int) { std::cout<<"trololo\n"; }
}
 
struct B: event::listen<int> {
    void readMessage(int) { std::cout<<"ololo\n"; }
}
 
int main(){
    event::send(10);
}
о боже! А и Б у нас оказывается родственники.
0
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
15.01.2016, 00:33 #99
Цитата Сообщение от Croessmah Посмотреть сообщение
Послать отсутствующее сообщение? Круть.
Оно не отсутствующее. Вы же вызываете конструктор, значит посылаете сообщение.

Цитата Сообщение от hoggy Посмотреть сообщение
тоже самое, только по-русски.
Что не понятно?

Есть тип A, определяемый классом A, у него есть набор сообщений которые он может верно обработать, то есть при выполнении предусловий гарантировать выполнение постусловий и завершить обработку. Есть тип B, определяемый классом B, у него есть набор своих сообщений, которые он может корректно обработать. Если все корректные для A сообщения корректны для B, то B наследует A.


Цитата Сообщение от hoggy Посмотреть сообщение
тезис никак не противоречит специфике с++
Если инициализация не прошла, то память вряд ли содержит верное или вообще хоть сколько-нибудь предсказуемое значение. Тогда эта память никак не может быть объектом, который должен быть верным значением. По-моему явное противоречие.

Добавлено через 4 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
А и Б у нас оказывается родственники.
Да, вполне может быть. В некоторых языках этого достаточно, чтобы признать объекты, обрабатывающие одинаковые сообщения, объектами одного типа. И ничего дополнительно не требуется сообщать.
0
hoggy
Нарушитель
6588 / 2769 / 476
Регистрация: 15.11.2014
Сообщений: 6,112
Завершенные тесты: 1
15.01.2016, 00:38 #100
Добавлено через 3 минуты
Цитата Сообщение от mporro Посмотреть сообщение
Есть тип A, определяемый классом A, у него есть набор сообщений которые он может верно обработать, то есть при выполнении предусловий гарантировать выполнение постусловий и завершить обработку. Есть тип B, определяемый классом B, у него есть набор своих сообщений, которые он может корректно обработать. Если все корректные для A сообщения корректны для B, то B наследует A.
все это очень здорово.
только это - о типах.
причем тут объекты?

Цитата Сообщение от mporro Посмотреть сообщение
Если инициализация не прошла, то память вряд ли содержит верное или вообще хоть сколько-нибудь предсказуемое значение. Тогда эта память никак не может быть объектом, который должен быть верным значением.
тогда объект находится в неконсистентном состоянии.
однако не означает, что объекта не существует.
Цитата Сообщение от mporro Посмотреть сообщение
Да, вполне может быть. В некоторых языках
вы не забыли, где вы находитесь?
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
15.01.2016, 00:38 #101
Цитата Сообщение от mporro Посмотреть сообщение
Если инициализация не прошла, то память вряд ли содержит верное или вообще хоть сколько-нибудь предсказуемое значение.
Нам не всегда нужно значение объекта.
Частенько нужен лишь его тип, а его значение не представляет ценности.
Цитата Сообщение от mporro Посмотреть сообщение
Вы же вызываете конструктор, значит посылаете сообщение.
Сообщение об инициализации? А кому я его посылаю, если Вы утверждаете, что не инициализированный объект - это не объект?
0
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
15.01.2016, 01:00 #102
Цитата Сообщение от Croessmah Посмотреть сообщение
Нам не всегда нужно значение объекта.
Частенько нужен лишь его тип, а его значение не представляет ценности.
Хорошо. Это чрезвычайно странно. Но допустим.
Вызовем оператор new (не выражение) и получим нужного типа указатель, даже не нулевой. И не будет у нас объекта никакого.

Я думаю, что стандарт определяет объект, как память, потому что где-то есть ещё правила адресации нестатических методов класса, к которым относится, видимо, и конструктор. И для реализации С++ крайне важно, чтобы здесь не было дыры. Иначе не ясно будет, как вызвать конструктор, если объекта нет, а он не является статическим методом.


Цитата Сообщение от Croessmah Посмотреть сообщение
А кому я его посылаю, если Вы утверждаете, что не инициализированный объект - это не объект?
Я с этого и начал. Обсуждение наследования конструкторов не имеет смысла, потому что конструкторы всё равно не составляют часть интерфейса, так как подобные сообщения принципиально не могут быть посланы объектам.


Цитата Сообщение от hoggy Посмотреть сообщение
причем тут объекты?
Типы определяют контракты: набор сообщений и пред- пост- условия. Типы приписываются объектам. Именно объекты получают сообщения и обрабатывают сообщения.
0
kzru_hunter
1090 / 765 / 58
Регистрация: 01.02.2011
Сообщений: 1,779
Записей в блоге: 1
15.01.2016, 01:01 #103
Можно же любой участок памяти заставить компилятор считать объектом определенного типа (при этом не обязательно что-то инициализировать и выделять память):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class D
{
public:
    void show()
    {       
        printf("m=%d\n", m);
    }
    int m;
};
 
int main()
{
        // не обязательно выделять память и инициализировать ниже
    int *p = new int[1];    
    *p = 777; 
 
    D *d = reinterpret_cast<D*>(p);
    d->show();  
    
    system("pause");
}
Главное, чтобы при обращении к интерфейсу такого якобы объекта, не поймать исключение.
0
hoggy
Нарушитель
6588 / 2769 / 476
Регистрация: 15.11.2014
Сообщений: 6,112
Завершенные тесты: 1
15.01.2016, 01:09 #104
Цитата Сообщение от mporro Посмотреть сообщение
Именно объекты получают сообщения и обрабатывают сообщения.
куски памяти ничего не получают и не обрабатывают.

Добавлено через 1 минуту
Цитата Сообщение от mporro Посмотреть сообщение
Я думаю, что стандарт определяет объект, как память, потому что где-то есть ещё правила адресации нестатических методов класса, к которым относится, видимо, и конструктор. И для реализации С++ крайне важно, чтобы здесь не было дыры. Иначе не ясно будет, как вызвать конструктор, если объекта нет, а он не является статическим методом.
кто-нибудь смог понять этот поток сознания?
0
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
15.01.2016, 01:10 #105
Цитата Сообщение от hoggy Посмотреть сообщение
тогда объект находится в неконсистентном состоянии.
В рамках подхода Бертрана Мейера это не объект. Если мы попадаем в ситуацию, что нечто больше не является верным значением абстрактного типа, придётся свернуть работу исключением.

Можно сказать, что всё есть объект. В том смысле, что даже просто часть памяти -- это объект. Но у неё будет специальный тип -- "часть памяти". И до инициализации или в любом неконсистентном состоянии, это будет объект типа "часть памяти". Но никак не объект определённого пользователем абстрактного типа. В этом случае абстрактный тип всё равно не сможет полагаться на наследование конструкторов, ибо конструктор оперирует объектами типа "часть памяти", а не абстрактного типа.

Добавлено через 36 секунд
Цитата Сообщение от hoggy Посмотреть сообщение
куски памяти ничего не получают и не обрабатывают.
И потому не являются объектами.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2016, 01:10
Привет! Вот еще темы с ответами:

Конструкторы и деструкторы - C++
Код: #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; class complex { private: double im; double...

Конструкторы и деструкторы - C++
Помогите исправить программу. Необходимо реализовать класс с двумя полями, имеющими имена first и second. Обязательно должны...

Конструкторы и деструкторы - C++
Прочитал про конструкторы и деструкторы. Пишут что они нужны для инициализации переменных класса. Как они используются я понял, но не понял...

Конструкторы и деструкторы - C++
Привет. Есть структура, содержащая 7 полей, в которые я ввожу значения с клавиатуры. Нужно используя конструкторы и деструкторы...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.01.2016, 01:10
Ответ Создать тему
Опции темы

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