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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 55, средняя оценка - 4.93
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
02.06.2009, 14:54     Наследуются ли конструкторы и деструкторы? #1
При наследовании происходит ли наследование конструкторов и деструкторов базового класса?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2009, 14:54     Наследуются ли конструкторы и деструкторы?
Посмотрите здесь:

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

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


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


Цитата Сообщение от hoggy Посмотреть сообщение
причем тут объекты?
Типы определяют контракты: набор сообщений и пред- пост- условия. Типы приписываются объектам. Именно объекты получают сообщения и обрабатывают сообщения.
kzru_hunter
 Аватар для kzru_hunter
1084 / 759 / 58
Регистрация: 01.02.2011
Сообщений: 1,771
Записей в блоге: 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");
}
Главное, чтобы при обращении к интерфейсу такого якобы объекта, не поймать исключение.
hoggy
5031 / 2114 / 403
Регистрация: 15.11.2014
Сообщений: 4,799
Завершенные тесты: 1
15.01.2016, 01:09     Наследуются ли конструкторы и деструкторы? #104
Цитата Сообщение от mporro Посмотреть сообщение
Именно объекты получают сообщения и обрабатывают сообщения.
куски памяти ничего не получают и не обрабатывают.

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

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

Добавлено через 36 секунд
Цитата Сообщение от hoggy Посмотреть сообщение
куски памяти ничего не получают и не обрабатывают.
И потому не являются объектами.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11807 / 6786 / 767
Регистрация: 27.09.2012
Сообщений: 16,839
Записей в блоге: 2
Завершенные тесты: 1
15.01.2016, 01:12     Наследуются ли конструкторы и деструкторы? #106
Цитата Сообщение от mporro Посмотреть сообщение
Это чрезвычайно странно.
Да что тут странного?
Например, если у нас летит объект std::bad_alloc,
мне абсолютно наплевать что там оно внутри себя содержит,
мне важен сам тип исключения
(что там выдаст what значения для программы не имеет,
лишь радует глаз пользователя, но я и сам могу картину наляпать не хуже,
основываясь на типе исключения).
Цитата Сообщение от mporro Посмотреть сообщение
И не будет у нас объекта никакого.
Почему это нет? Мы может обратиться к этому участку памяти,
интерпретировав его так, как мы хотим.
Вы путаете понятие объект и время жизни объекта.
hoggy
5031 / 2114 / 403
Регистрация: 15.11.2014
Сообщений: 4,799
Завершенные тесты: 1
15.01.2016, 01:19     Наследуются ли конструкторы и деструкторы? #107
Цитата Сообщение от mporro Посмотреть сообщение
В рамках подхода Бертрана Мейера это не объект.
мне не знаком этот персонаж.
однако, я не уверен, что мне будет интересно мнение человека,
который противоречит стандарту языка.
подозреваю, что он не из мира с++

Цитата Сообщение от mporro Посмотреть сообщение
Если мы попадаем в ситуацию, что нечто больше не является верным значением абстрактного типа, придётся свернуть работу исключением.
допустим (хотя это и не обазательно), ну и что?

Цитата Сообщение от mporro Посмотреть сообщение
В том смысле, что даже просто часть памяти -- это объект.
бинго!
Цитата Сообщение от mporro Посмотреть сообщение
Но никак не объект определённого пользователем абстрактного типа.
вам тут выше кучу примеров практических привели,
которые иллюстрируют это положение.

как вы назваете людей, которые отрицают очевидное, реальное на практике?
я называю их {CENSORED}.

Цитата Сообщение от mporro Посмотреть сообщение
В этом случае абстрактный тип всё равно не сможет полагаться на наследование конструкторов
а это уже его личные трудности.
и трудности его программиста.
к факту его природе, безразличные.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
15.01.2016, 01:38     Наследуются ли конструкторы и деструкторы? #108
Цитата Сообщение от Croessmah Посмотреть сообщение
интерпретировав его так, как мы хотим.
Мы рискуем попасть в ситуацию, что значение в памяти не является корректным значением абстрактного типа и поведение программы даже без апелляции к UB окажется непредсказуемо. Такая программа вряд ли интересна.

Цитата Сообщение от Croessmah Посмотреть сообщение
Да что тут странного?
Странно пытаться называть объектом то, что объектом не является, чтобы потом всё равно от него отказаться...
Причины, по которым в стандарте часть памяти уже называется объектом наверняка есть и она не тривиальная и с объектно-ориентированным программированием вообще никак не связана.

Добавлено через 10 минут
Цитата Сообщение от hoggy Посмотреть сообщение
вам тут выше кучу примеров практических привели,
которые иллюстрируют это положение
Можно сколько угодно привести положительных примеров, но они не приведут к обобщению.
Но достаточно привести один пример отрицательный, чтобы обобщение не было возможно.
Пример отрицательный есть
C++
1
int *i = (int *)malloc(10*sizeof(int));
Я не могу совершить с этим "объектом" никаких действий, верных для объекта целого числа. Например сложить с другим целым числом.


Цитата Сообщение от hoggy Посмотреть сообщение
мне не знаком этот персонаж
Значит Вы упустили значительную часть объектно-ориентированного программирования
Бертран Мейер
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11807 / 6786 / 767
Регистрация: 27.09.2012
Сообщений: 16,839
Записей в блоге: 2
Завершенные тесты: 1
15.01.2016, 01:45     Наследуются ли конструкторы и деструкторы? #109
Цитата Сообщение от mporro Посмотреть сообщение
Мы рискуем попасть в ситуацию, что значение в памяти не является корректным значением абстрактного типа и поведение программы даже без апелляции к UB окажется непредсказуемо. Такая программа вряд ли интересна.
Ой да ладно? Для эксплоита это самое то - заставить работать по другому.
Цитата Сообщение от mporro Посмотреть сообщение
Причины, по которым в стандарте часть памяти уже называется объектом наверняка есть и она не тривиальная и с объектно-ориентированным программированием вообще никак не связана.
Само собой. Потому что C++ поддерживает не только ООП парадигму. Соответственно, ему нужно оперировать термином объект не из ООП.
hoggy
5031 / 2114 / 403
Регистрация: 15.11.2014
Сообщений: 4,799
Завершенные тесты: 1
15.01.2016, 02:12     Наследуются ли конструкторы и деструкторы? #110
Цитата Сообщение от mporro Посмотреть сообщение
Я не могу совершить с этим "объектом" никаких действий, верных для объекта целого числа. Например сложить с другим целым числом.
ну и? вы сказать то что хотели?
Цитата Сообщение от mporro Посмотреть сообщение
Значит Вы упустили значительную часть объектно-ориентированного программирования
я как бы в гугле не забанен
какое это имеет отношение к с++ ?
kzru_hunter
 Аватар для kzru_hunter
1084 / 759 / 58
Регистрация: 01.02.2011
Сообщений: 1,771
Записей в блоге: 1
15.01.2016, 03:04     Наследуются ли конструкторы и деструкторы? #111
Цитата Сообщение от mporro Посмотреть сообщение
Страуструп имеет в виду, что если бы конструктор был унаследован, то не требовалось бы его генерировать.
Насчет наследования конструктора, деструктора и копир. оператора присваивания: я вроде бы увидел кое-какую связь.
Все обычные методы при наследовании, если они не были переопределены в производном классе, могут использоваться производным классом напрямую. Единственно, когда они переопределяются в производном классе, то версии базового класса становятся скрытыми.
Но у конструктора, деструктора и копирующего оператора присваивания есть отличие от методов. При их наследовании не получится использовать версии базового класса напрямую, т.е. без всяких ухищрений вроде применения оператора расширения видимости, даже когда в производном классе они явно НЕ определены (а методы можно было). Предполагается, что производный класс в этом случае не хочет наследовать версию конструктора, деструктора, копирующего оператора присваивания базового класса обычным образом, чтобы потом их можно было использовать напрямую. Вместо этого, в этой же ситуации (когда constr,destr,copy op= не определены явно) производный класс использует свою собственную версию, которая компилятором автоматически генерируется своеобразным образом, и в код которой вставляется вызов версии базового класса.

Я так полагаю, под понятием наследования в C++ понимается некоторое специфичное наследование, а не то простое, которое мы все привыкли понимать?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
15.01.2016, 04:52     Наследуются ли конструкторы и деструкторы? #112
Почитал с утра, что за (мою) ночь написали. Вот что мне это напомнило

Создание объектов в С++ наводит на неполноту квантовой механики при переходе от субатомных систем к макроскопическим. Согласно квантовой механике, если над конструктором не производится наблюдение, то его состояние описывается суперпозицией (смешением) двух состояний — отработанного и неотработанного конструктора, следовательно, объект, находящийся в памяти, и создан, и не создан одновременно. Если же мы заглянем в память в случайное время, то экспериментатор может увидеть только какое-нибудь одно конкретное состояние — «конструктор отработал, объект создан» или «конструктор не отработал, объект не создан».
Думаю все знают откуда это
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
15.01.2016, 11:46     Наследуются ли конструкторы и деструкторы? #113
Цитата Сообщение от kzru_hunter Посмотреть сообщение
под понятием наследования в C++ понимается некоторое специфичное наследование
Да. В С++ есть своё понятие наследования. И его никак нельзя путать с понятием "наследования" из объектно-ориентированной методологии построения программ.


Croessmah
По поводу объекта и "куска памяти".
The constructs in a C + + program create, destroy, refer to, access, and manipulate objects. An object is a
region of storage.
[Note: A function is not an object, regardless of whether or not it occupies storage in the
way that objects do. ] An object is created by a definition (3.1), by a new-expression (5.3.4) or by the
implementation (12.2) when needed. The properties of an object are determined when the object is created.
An object can have a name (clause 3). An object has a storage duration (3.7) which influences its lifetime
(3.8). An object has a type (3.9). The term object type refers to the type with which the object is created.
Объект -- это не только память, но и связанный тип. А тип можно получить только при создании. А создание подразумевает выражение new, которое приводит к вызову конструктора, либо дефиниции, которая приводит к вызову конструктора, либо обращает на с к пункту, где вновь рекурсивно говорится о создании объекта.

Из того, что есть объект, вытекает, что у него есть тип. Из того, что у него есть тип, следует, что он был создан. Раз он был создан -- конструктор был вызван.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11807 / 6786 / 767
Регистрация: 27.09.2012
Сообщений: 16,839
Записей в блоге: 2
Завершенные тесты: 1
15.01.2016, 12:04     Наследуются ли конструкторы и деструкторы? #114
Цитата Сообщение от mporro Посмотреть сообщение
Из того, что есть объект, вытекает, что у него есть тип.
Конечно есть. Но это не значит, что объекта нет, когда он не инициализирован.
Вот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
class Test
{
public:
    int x ;
    int y ;
} ;
 
 
 
int main()
{
    Test * p  = new Test ;
    std::cout << p->x << ":" << p->y << std::endl ;
}
http://rextester.com/QNPUX19975
В данном случае инициализация не проводится, но объект есть.
Или хотите сказать, что его нет?
Точнее, инициализация проводится, но ничего при этом не инициализируется.
Lifetime объекта началось.
Не инициализирующая инициализация, круто, да?

Добавлено через 1 минуту
Цитата Сообщение от mporro Посмотреть сообщение
Раз он был создан -- конструктор был вызван.
Вызван. Только объект уже есть к тому времени. Он просто находится в вялом состоянии.
пример:
C++
1
std::string str = str ;//str инициализируется копирующим конструктором, при этом дефолтный не вызывается. Поэтому состояние str не понятно какое. Но объект есть.
Добавлено через 5 минут
Цитата Сообщение от mporro Посмотреть сообщение
Объект -- это не только память, но и связанный тип.
а еще время хранения. Но здесь не сказано, что не бывает не инициализированных объектов.

Добавлено через 2 минуты
Думаю, стоит закончить данный разговор.
Вывод здесь один - не инициализированный объект,
такой же объект, как и все остальные,
даже если в книжке по ООП говорится по другому.
Хотя бы потому, что ООП - не единственная парадигма,
которая худо-бедно поддерживается в C++.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
15.01.2016, 12:04     Наследуются ли конструкторы и деструкторы? #115
Цитата Сообщение от Croessmah Посмотреть сообщение
объекта нет, когда он не инициализирован
Пока забыли про инициализацию. Там уже всё понятно. Неинициализированный объект C++ не является объектом с точки зрения методологии ООП, но является объектом С++.

Однако даже в рамках C++ "часть памяти" -- не является объектом, что мне пытались вменить на протяжении нескольких страниц.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11807 / 6786 / 767
Регистрация: 27.09.2012
Сообщений: 16,839
Записей в блоге: 2
Завершенные тесты: 1
15.01.2016, 12:28     Наследуются ли конструкторы и деструкторы? #116
Цитата Сообщение от mporro Посмотреть сообщение
Неинициализированный объект C++ не является объектом с точки зрения методологии ООП, но является объектом С++.
Бинго! Вам об этом и толкуют.

Добавлено через 1 минуту
Цитата Сообщение от mporro Посмотреть сообщение
Однако даже в рамках C++ "часть памяти" -- не является объектом, что мне пытались вменить на протяжении нескольких страниц.
Заметьте, что объект имеет тип, также имеет время хранения, время жизни, он всё это ИМЕЕТ, но сказано же,
An object is a region of storage.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
15.01.2016, 12:40     Наследуются ли конструкторы и деструкторы? #117
Croessmah
Курица -- это птица.
У курицы острый клюв.

Курица, конечно птица. Но не всякая птица курица. А какая птица курица? У которой есть острый клюв.

Цитата Сообщение от Croessmah Посмотреть сообщение
An object is a region of storage.
Это только часть определения.
Полное определение объекта включает понятие о его типе и его конструировании.

The constructs in a C + + program create, destroy, refer to, access, and manipulate objects. An object is a
region of storage. [Note: A function is not an object, regardless of whether or not it occupies storage in the
way that objects do. ] An object is created by a definition (3.1), by a new-expression (5.3.4) or by the
implementation (12.2) when needed. The properties of an object are determined when the object is created.
An object can have a name (clause 3). An object has a storage duration (3.7) which influences its lifetime
(3.8). An object has a type (3.9). The term object type refers to the type with which the object is created.
Даже специально подписано, что функций, хотя и занимает память, не является объектом.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11807 / 6786 / 767
Регистрация: 27.09.2012
Сообщений: 16,839
Записей в блоге: 2
Завершенные тесты: 1
15.01.2016, 12:48     Наследуются ли конструкторы и деструкторы? #118
Цитата Сообщение от mporro Посмотреть сообщение
Курица, конечно птица. Но не всякая птица курица. А какая птица курица? У которой есть острый клюв.
Таким образом, курица наследник птицы.
Если птице оторвать в один момент клюв, она не перестанет быть птицей.
Цитата Сообщение от mporro Посмотреть сообщение
Полное определение объекта включает понятие о его типе и его конструировании.
Это уже не определение, а то, что еще имеет или может иметь объект.
Закончим!
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
15.01.2016, 12:52     Наследуются ли конструкторы и деструкторы? #119
Цитата Сообщение от Croessmah Посмотреть сообщение
Закончим!
Согласен! Мне лично всё понятно. Вам я объяснить попытался. Моя совесть чиста.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2016, 14:06     Наследуются ли конструкторы и деструкторы?
Еще ссылки по теме:

Конструкторы и деструкторы C++
C++ Конструкторы и деструкторы
Конструкторы и деструкторы C++

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

Или воспользуйтесь поиском по форуму:
gng
605 / 451 / 122
Регистрация: 08.09.2013
Сообщений: 1,152
15.01.2016, 14:06     Наследуются ли конструкторы и деструкторы? #120
An object is a region of storage.
Интересная ситуация.
Когда высокоуровневые программисты, или просто математики, знакомятся с языком Си, они не могут вместить:
char ch= 45;
поскольку символ и целое число - совершенно различные сущности.
Верна, оказывается, и обратная ситуация. Законченному Сишнику (ну ладно, Плюсисту, что, как показал этот топик, одно и то же) трудно объяснить, что объект и кусок памяти - это, вообще-то, разные понятия. :-)))
Напомнило школьный анекдот. Начинающие программисты считают, что в килобайте 1000 байт, а продвинутые - что в килограмме - 1024 грамм.
На всякий случай предупрежу - я никого не имел в виду конкретно. Сам хоть по образованию математик (физик-теоретик), но как программист - законченный сишник-технарь.
Yandex
Объявления
15.01.2016, 14:06     Наследуются ли конструкторы и деструкторы?
Ответ Создать тему
Опции темы

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