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

Ромбовидное наследование. Деструкторы. - C++

Восстановить пароль Регистрация
 
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
10.04.2012, 17:14     Ромбовидное наследование. Деструкторы. #1
глобальная цель - ромбовидное наследование. Сейчас цель - разобраться с вызовами конструкторов/деструкторов.
в смысловую нагрузку кода не вникайте - там смысла оч мало
важно - в конструкторе выделяется динамическая память - в деструкторе возвращается. Сейчас есть только 2 класса - базовый и 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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
 
class chipset
{
    short *USB_number;//[0] - usb2 / [1] - usb3
    
public:
    chipset(short usb2, short usb3)
    {
        USB_number = new short[2];
        USB_number[0] = usb2;
        USB_number[1] = usb3;
    }
    
    chipset(chipset &chip)
    {
        USB_number = new short[2];
        USB_number[0] = chip.USB_number[0];
        USB_number[1] = chip.USB_number[1];
    }
 
    chipset()
    {
        USB_number = new short[2];
        USB_number[0] = 4;
        USB_number[1] = 0;
    }
 
    void operator = (chipset &chip)
    {
        USB_number[0] = chip.USB_number[0];
        USB_number[1] = chip.USB_number[1];
    }
 
    void print()
    {
        cout<<"USB2 \t-\t"<<USB_number[0]<<" шт."<<endl;
        cout<<"USB3 \t-\t"<<USB_number[1]<<" шт."<<endl;
    }
 
    ~chipset()
    {
        delete [] USB_number;
    }
};
 
class chipsetP : virtual public chipset
{
    short* Multi;
    bool SLI_CF_enable;
 
protected:
 
    void _print()
    {
        cout<<"ядро1 Множитель \t-\tx"<<Multi[0]<<endl;
        cout<<"ядро2 Множитель \t-\tx"<<Multi[1]<<endl;
        if (SLI_CF_enable)
            cout<<"SLI/CrossFire \t-\t включён"<<endl;
        else
            cout<<"SLI/CrossFire \t-\t выключен"<<endl;
    }
 
public:
    chipsetP(short usb2, short usb3, short core1, short core2, bool SC):chipset(usb2, usb3)
    {
        Multi = new short[2];
        Multi[0] = core1;
        Multi[1] = core2;
        SLI_CF_enable = SC;
    }
 
    chipsetP(chipsetP & cp):chipset(cp) //вопрос
    {
        Multi = new short[2];
        Multi[0] = cp.Multi[0];
        Multi[1] = cp.Multi[1];
        SLI_CF_enable = cp.SLI_CF_enable;
    }
 
    chipsetP():chipset()
    {
        Multi = new short[2];
        Multi[0] = 30;
        Multi[1] = 30;
    }
 
    void print()
    {
        chipset::print();
        _print();
    }
 
    ~chipsetP()
    {
        delete [] Multi;
        chipset::~chipset();
    }
};
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0,"Rus");
    chipsetP* P55 = new chipsetP;
    //chipsetP P55(4, 0, 32, 30, true);
    P55->print();
 
    delete P55;
    return 0;
}
Принт происходит правильно. Объект создаётся. Ошибка в деструкторе на этапе выполнения
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2012, 17:14     Ромбовидное наследование. Деструкторы.
Посмотрите здесь:

C++ Деструкторы
Ромбовидное наследование. Конструктор внука. C++
Наследование. Виртуальные методы/деструкторы. C++
Где деструкторы? C++
C++ Деструкторы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IPtv
8 / 8 / 0
Регистрация: 10.04.2012
Сообщений: 34
10.04.2012, 17:36     Ромбовидное наследование. Деструкторы. #2
Цитата Сообщение от IcyWind Посмотреть сообщение
C++
1
2
3
4
5
~chipsetP()
    {
        delete [] Multi;
        chipset::~chipset();   /// WTF????
    }
Ошибка в деструкторе на этапе выполнения
ну ещё бы.
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
10.04.2012, 17:52  [ТС]     Ромбовидное наследование. Деструкторы. #3
Мне нужно не только тыкнуть носом)
такая ошибка из-за непонимания...что делать...
нужно удалить поле в производном классе, но и в базовом...
конечно, можно это сделать явно. тогда, скажем, у внука тоже придётся удалять всё явно...
а хотелось сделать примерно так
"действия своего деструктора"
"вызвать деструкторы предков"
IPtv
8 / 8 / 0
Регистрация: 10.04.2012
Сообщений: 34
10.04.2012, 19:18     Ромбовидное наследование. Деструкторы. #4
Цитата Сообщение от IcyWind Посмотреть сообщение
Мне нужно не только тыкнуть носом)
такая ошибка из-за непонимания...что делать...
нужно удалить поле в производном классе, но и в базовом...
конечно, можно это сделать явно. тогда, скажем, у внука тоже придётся удалять всё явно...
а хотелось сделать примерно так
"действия своего деструктора"
"вызвать деструкторы предков"
ок. не только тыкаю - у вас дыры в понимании наследования как оно в с++ есть.
при создании класса сначала вызываются конструкторы базовых классов в соответствии с деревом наследования, при удалении класса вызываются деструкторы в порядке обратном конструкторам - самому не надо ручками вызывать деструктор. пока мало опыта, лучше придерживаться правила - никогда самому не вызывать деструктор.

в качестве совета - напишите в деструкторах/конструкторах вывод отладочных сообщений типа "тут был вася" - всё наглядно и сразу станет понятно. успехов
Yandex
Объявления
10.04.2012, 19:18     Ромбовидное наследование. Деструкторы.
Ответ Создать тему
Опции темы

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