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

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

Войти
Регистрация
Восстановить пароль
 
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
#1

что происходит со старым конструктором когда я создаю новый, пренадлежащий производному типу? (первый конструктор пренадлежит базовому типу) - C++

08.07.2010, 11:26. Просмотров 948. Ответов 10
Метки нет (Все метки)

1) что происходит со старым конструктором когда я создаю новый, пренадлежащий производному классу? (первый конструктор пренадлежит базовому классу). я могу использовать оба конструктора?
2) тот же вопрос по отношению к дестукторам.

извените за ошибку в назвнии темы - везде вместо слова "тип" должно быть слово "класс".
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2010, 11:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос что происходит со старым конструктором когда я создаю новый, пренадлежащий производному типу? (первый конструктор пренадлежит базовому типу) (C++):

Приведение к базовому типу - C++
#include <iostream> using namespace std; class A{ public: virtual ~A() {} }; class B: public A{ };

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

Выражение должно относиться к целочисленному типу или типу перечисления без области видимости - C++
#include <iostream> #include <cmath> using namespace std; int main() { int N; double Y = 0; setlocale(0,""); cout <<...

Выражение должно относиться к целочисленному типу или типу перечисления без области видимости - C++
Добрый день,столкнулся с проблемой "Выражение должно относиться к целочисленному типу или типу перечисления без области видимости" в такой...

2IntelliSense: выражение должно относиться к целочисленному типу или типу перечисления без области видимости - C++
"Выражение должно относиться к целочисленному типу или типу перечисления без области видимости" Что это за ошибка такая и как ее исправить?...

Generic Типы и UpCast к базовому интерфейсному типу(ковариантность обобщений) - C#
Всем привет, имеется следующий код: public abstract class Shape { } public class Circle : Shape { } public interface...

10
Nameless One
Эксперт С++
5780 / 3429 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
08.07.2010, 12:28 #2
Цитата Сообщение от nikkka Посмотреть сообщение
я могу использовать оба конструктора?
Оба конструктора (и деструктора) можно и даже нужно использовать.
Вот небольшой пример.
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
 
class parent
{
protected:
    int* m_pn;
public:
    parent(int x)
    {
        m_pn = new int(x);
        std::cout << "Constructor of the parent class" << std::endl;
    }
    virtual ~parent()
    {
        delete m_pn;
        std::cout << "Destructor of the parent class" << std::endl;
    }
};
 
class heir: public parent
{
private:
    double* m_pd;
public:
    heir(int x, double y)
        :parent(x)
    {
        m_pd = new double(y);
        std::cout << "Constructor of the inherit class" << std::endl;
    }
    virtual ~heir()
    {
        delete m_pd;
        std::cout << "Destructor of the inherit class" << std::endl;
    }
};
 
int main()
{
    parent* pprn = new heir(8, 9.5);
    delete pprn;
    system("pause");
    return EXIT_SUCCESS;
}
Конструктор класса heir (производного) вызывает конструктор класса parent (базового), чтобы инициализировать поля базового класса. При вызове деструктора производного класса также автоматически вызывается деструктор базового класса, чтобы зачистить данные базового класса. Обрати внимание на результаты работы программы.

Добавлено через 4 минуты

Не по теме:

Цитата Сообщение от nikkka Посмотреть сообщение
извените за ошибку в назвнии темы - везде вместо слова "тип" должно быть слово "класс"
Можно говорить, что это синонимы.

2
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
08.07.2010, 12:33 #3
Ничего с ним не происходит он по прежнему существует и участвует в создании обьектов производного
класса,сначала вызывается конструктор базового класса потом производного с деструкторами так же только вызываются они в порядке обратном конструкторам
1
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
08.07.2010, 12:42  [ТС] #4
а каким именем мне вызвать старый конструктор? (баз класс - class1, пр. класс class2)
0
Nameless One
Эксперт С++
5780 / 3429 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
08.07.2010, 12:54 #5
Смотри внимательно:
C++
1
2
3
4
5
6
heir(int x, double y)
     :parent(x)
 {
     m_pd = new double(y);
     std::cout << "Constructor of the inherit class" << std::endl;
}
В списке инициализации (по-моему, он так называется) конструктора производного класса heir вызывается конструктор базового класса parent.
1
usernet009
24 / 24 / 1
Регистрация: 28.12.2009
Сообщений: 85
08.07.2010, 14:37 #6
Nameless One,
C++
1
2
3
4
5
        virtual ~heir()
        {
                delete m_pd;
                std::cout << "Destructor of the inherit class" << std::endl;
        }
Тут разве не delete []m_pd надо писать ?
1
Chevit
3 / 3 / 0
Регистрация: 06.07.2010
Сообщений: 18
08.07.2010, 16:54 #7
Цитата Сообщение от usernet009 Посмотреть сообщение
Nameless One,
Тут разве не delete []m_pd надо писать ?
Можно писать ,но не обязательно, по крайней мере в С++
1
easybudda
Модератор
Эксперт CЭксперт С++
9912 / 5835 / 975
Регистрация: 25.07.2009
Сообщений: 11,004
08.07.2010, 17:01 #8
Цитата Сообщение от Chevit Посмотреть сообщение
Тут разве не delete []m_pd надо писать ?
Можно писать ,но не обязательно, по крайней мере в С++
Оператор delete [] должен возвращать память, выделенную оператором new [], то есть, если память выделялась для массива элементов, то и возвращаться должна сответственно. Если была выделена память для одного элемента (m_pn = new int(x)), то и возвращать нужно соответственно delete m_pn; Ошибки при использовании оператора delete[] возможно и не будет (даже скорее всего - массив из одного элемента - вещь не часто, но встречающаяся), но как-то это идеологически не правильно...
2
CheshireCat
Эксперт С++
2899 / 1248 / 78
Регистрация: 27.05.2008
Сообщений: 3,414
08.07.2010, 17:32 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Дополню коллегу easybudda: это не только идеологически неправильно, но, в соответствии с правилами языка, прямо ведет к Undefined Behavior - неопределенному поведению программы.В 99% случаев это останется незамеченным, но в оставшемся 1% - программа рухнет, причем, по закону подлости, именно в момент демонстрации Самому Жирному Заказчику....
3
easybudda
08.07.2010, 19:12
  #10

Не по теме:

Цитата Сообщение от CheshireCat Посмотреть сообщение
программа рухнет, причем, по закону подлости, именно в момент демонстрации Самому Жирному Заказчику....
Это под какой-нибудь из законов Мёрфи попадает, я думаю...

0
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
08.07.2010, 19:17  [ТС] #11
ага, закон Бьерна Мерфи..
0
08.07.2010, 19:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2010, 19:17
Привет! Вот еще темы с ответами:

Определить, что происходит при вводе значений, не соответствующих требуемому типу или выходящих за пределы - C#
Не проходили C#, но задали задания, вообще не в курсе как делать. Построить циклическое консольное приложение &quot;Decimal тип&quot;....

Как создать объект по его типу, не используя конструктор? - C#
Необходимо создать объект, зная его тип. Activator.CreateInstanc использует конструктор, так что он не подходит.

Проектирование базы данных. Что стоит почитать именно по типу key-value? - C (СИ)
В качестве курсовой нужно запрогать базу данных типа key-value. Не могли бы вы подсказать, что стоит почитать именно по типу key-value? И...

Предупреждение "Possible unintended reference comparison", несмотря на то, что я сделал приведение к одному типу - C#
Использую такое условие в программе: if (mainWindow.listViewUsers.Items.Tag.ToString() == iD) { ///code... } Среда ругается...


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

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

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