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

Ошибка в наследовании - C++

Восстановить пароль Регистрация
 
titans2011
294 / 255 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
07.05.2012, 13:30     Ошибка в наследовании #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
#include <iostream>
using namespace std;
 
 
class A
{
public :
A(){}
~A(){}
virtual void eat()
        {
        cout<<"A eat aaa"<<endl;
        }
};
class B:public A
{
public :
B(){}
~B(){}
virtual void eat()
        {
        cout<<"B eat bbb"<<endl;
        }
};
 
class C:public  B
{
    public :
C(){}
~C(){}
virtual void eat()
        {
        cout<<"C eat ccc"<<endl;
        }
};
 
class D:public C
{
public :
D(){}
~D(){}
virtual void eat()
        {
        cout<<"D eat ddd"<<endl;
        }
 
};
class F:public D,public A
{
public :
F(){}
~F(){}
virtual void eat()
        {
        cout<<"F eat fff"<<endl;
        }
 
};
int main()
{
A * d=new F();
d->eat();
//delete [] d;
d=new B();
d->eat();
F f;
f.C::eat();
//delete [] d;
return 0;
}
Почему, когда я убираю комментарии с delete [] d; программа ругается на этапе выполнения?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2012, 13:30     Ошибка в наследовании
Посмотрите здесь:

C++ Ошибка при наследовании
C++ Ошибка при наследовании
C++ Ошибка при наследовании
C++ Ошибка при наследовании?
C++ Ошибка при наследовании класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
07.05.2012, 13:35     Ошибка в наследовании #2
Цитата Сообщение от titans2011 Посмотреть сообщение
Почему, когда я убираю комментарии с delete [] d;
наверно потому что выделяешь один объект
Цитата Сообщение от titans2011 Посмотреть сообщение
A * d=new F()
а удаляешь массив
Цитата Сообщение от titans2011 Посмотреть сообщение
delete [] d;
может так
C++
1
delete d;
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
07.05.2012, 13:35     Ошибка в наследовании #3
Потому что d - не массив. Уберите квадратные скобки.
titans2011
294 / 255 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
07.05.2012, 13:45  [ТС]     Ошибка в наследовании #4
Убрал. Если так, то всё работает:
C++
1
2
3
4
5
6
7
8
A * d=new F();
d->eat();
//delete  d;
d=new B();
d->eat();
F f;
f.C::eat();
delete  d;
А если убрать комент с первого delete то не работает. Ну ведь я логически рассуждаю, если переопределяю память старую нужно грохнуть. А вылазиет ошибка:
Миниатюры
Ошибка в наследовании  
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
07.05.2012, 15:08     Ошибка в наследовании #5
во-первых уберите в классе F наследование от А, он и так не явно наследуется от него.
во-вторых в классе А диструктор лучше сделать виртуальным
http://liveworkspace.org/code/a9c333...b46724520e17fb
Yandex
Объявления
07.05.2012, 15:08     Ошибка в наследовании
Ответ Создать тему
Опции темы

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