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

При отсылке на абстрактный класс не запускается программу - C++

Восстановить пароль Регистрация
 
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
04.01.2014, 06:03     При отсылке на абстрактный класс не запускается программу #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
#include <iostream>
 
using namespace std; 
 
 
class E_Talon
{
public:
   E_Talon();
   void Print();
   virtual void Use() const = 0;
   virtual void Add() const = 0;
   int serial;
 
};
 
E_Talon::E_Talon()
{
  E_Talon::serial = 76568445;                
}
 
void E_Talon::Print()
{
                 cout << serial << endl;
}
 
/////////////////////////////////////////////////////////////////////////
//////////////////////
//////////////////
/////////////////////////////////////////////////////////////////////////
 
class BraucienuskET: public E_Talon
 
 {
 public:
 BraucienuskET();
 void Print(void);
 void Use (void);
 private:
 int trips;
 
 }; 
 
 BraucienuskET::BraucienuskET() 
 
 {
 BraucienuskET::trips = 10;
 }
 
 void BraucienuskET::Use()
 {
      if(trips>0)
      {
                 cout << endl << "GREEN" << endl;
                 
                 trips = trips-1;
                 
                 cout << "You trips limit: " << trips << endl;
      }
      else
      {
          cout << endl << "RED" << endl;
      }
 
 }
 
  void BraucienuskET::Print()
 {
       cout << "How much trips you have: ";
       cout << trips << endl;
 }
 
 
 
 int main()
 {
 
 BraucienuskET w;
 w.Print();
 w.Use();
 
 
 system("pause");
 return 0;
 }
Выдаёт ошибку в строке BraucienuskET w;
и пишет
не может объявить переменную `W 'к типу` BraucienuskET'
потому следующие виртуальные функции аннотация:
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2014, 06:03     При отсылке на абстрактный класс не запускается программу
Посмотрите здесь:

C++ абстрактный класс
абстрактный класс C++
C++ Абстрактный класс
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... C++
C++ Абстрактный класс
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
04.01.2014, 07:02     При отсылке на абстрактный класс не запускается программу #2
Нет реализации метода Use в наследнике.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.01.2014, 11:19     При отсылке на абстрактный класс не запускается программу #3
mster-doc, потому что константный метод и неконстантный метод - это разные методы. Даже если у них название одинаковое. В таких случаях как раз было бы полезно ключевое слово override из c++11.
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
04.01.2014, 14:17  [ТС]     При отсылке на абстрактный класс не запускается программу #4
0x10, в смысле?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void BraucienuskET::Use()
 {
      if(trips>0)
      {
                 cout << endl << "GREEN" << endl;
                 
                 trips = trips-1;
                 
                 cout << "You trips limit: " << trips << endl;
      }
      else
      {
          cout << endl << "RED" << endl;
      }
 
 }
а под override есть какая ни будь специальная библиотека, просто мне компилятор на него и жалуется.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.01.2014, 14:24     При отсылке на абстрактный класс не запускается программу #5
mster-doc, короче говоря, сделайте так в E_Talon:
C++
1
2
   virtual void Use() /* const */ = 0;
   //virtual void Add() const = 0;
Добавлено через 1 минуту
Цитата Сообщение от mster-doc Посмотреть сообщение
а под override есть какая ни будь специальная библиотека
компилятор должен поддерживать стандарт C++11.
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
04.01.2014, 15:35  [ТС]     При отсылке на абстрактный класс не запускается программу #6
а почему, если я делаю ещё одну виртуальную функцию, то код уже опять не работает?

C++
1
2
virtual void Use() /* const */ = 0;
virtual void Add() /* const */ = 0;
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.01.2014, 16:20     При отсылке на абстрактный класс не запускается программу #7
mster-doc, потому что где реализация ?
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 1
04.01.2014, 16:28     При отсылке на абстрактный класс не запускается программу #8
Еще один нюанс:
Цитата Сообщение от mster-doc Посмотреть сообщение
C++
1
2
3
BraucienuskET w;
w.Print(); 
w.Use();
Здесь Вы виртуальный механизм не используете
(в базовом классе можно было бы вообще не указывать этих функций).
Нужно так
C++
1
2
3
E_Talon* w=new BraucienuskET;// указатель базового класса инициализируем адресом производного класса
w->Print(); // Хотя используется указатель базового класса, но вызывается метод производного класса
w->Use();
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
04.01.2014, 16:35  [ТС]     При отсылке на абстрактный класс не запускается программу #9
А как можно объединить функции? Просто у меня функция Print встречается в обоих классах
в таком варианте
C++
1
2
BraucienuskET w;
w.Print();
выводится из класса BraucienuskET

а в
C++
1
2
3
E_Talon* w=new BraucienuskET;
w->Print(); 
из E_Talon
есть ли какой ни будь правильный способ, по мимо

C++
1
2
3
4
E_Talon* w=new BraucienuskET;
w->Print(); 
BraucienuskET w;
w.Print();
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.01.2014, 18:15     При отсылке на абстрактный класс не запускается программу #10
Цитата Сообщение от zss Посмотреть сообщение
Нужно так
Нужно ещё виртуальный деструктор добавить, иначе UB.
Цитата Сообщение от mster-doc Посмотреть сообщение
А как можно объединить функции?
Вызывать из дочернего класса базовую или в каком плане объединить?
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
04.01.2014, 18:27  [ТС]     При отсылке на абстрактный класс не запускается программу #11
[QUOTE=Tulosba;5593381]Нужно ещё виртуальный деструктор добавить, иначе UB.[QUOTE]
???

Планировалось выводить все функции Print со всех классов.
0x10
04.01.2014, 18:40
  #12

Не по теме:

Цитата Сообщение от mster-doc Посмотреть сообщение
0x10, в смысле?
Что-то я совсем заврался...

Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
04.01.2014, 18:58     При отсылке на абстрактный класс не запускается программу #13
Цитата Сообщение от Tulosba Посмотреть сообщение
Нужно ещё виртуальный деструктор добавить, иначе UB.
зачем?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.01.2014, 19:29     При отсылке на абстрактный класс не запускается программу #14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
зачем?
ISO/IEC 14882:2011 5.3.5/3
...if the static type of the object to be deleted is different from its dynamic type, the static type shall be a base class of the dynamic type of the object to be deleted and the static type shall have a virtual destructor or the behavior is undefined.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
04.01.2014, 21:08     При отсылке на абстрактный класс не запускается программу #15
Tulosba, и нафига? Если в моей программе все деструкторы по-умолчанию(как у автора), нафига добавлять виртуальный дестр-р? Покажи мне хоть один компилятор, который вызовет UB (а именно что-то иное помимо деструкторов по-умолчанию в такой программе)

Кстати, твоя цитата запросто может быть вырвана из контекста.

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
ISO/IEC 14882:2011
это вообще не С++, а С++11
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.01.2014, 21:33     При отсылке на абстрактный класс не запускается программу #16
Kuzia domovenok, зачем спорить со Стандартом? C++11 современная версия C++. Посмотри для интереса 2003 или 1998, если думаешь, что там было иначе с данным моментом.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
04.01.2014, 21:54     При отсылке на абстрактный класс не запускается программу #17
Tulosba, а по теме что? любой учебник С++ в главе "зачем нужны виртуальные функции" говорит, что без виртуальных функций при обращению к объекту класса по указателю на родителя будут вызываться родительские методы, даже если указатель указывает на объект производного класса. Это не баг, а фича.
С деструкторами та же самая история! Будет вызван деструктор родительский и всё. Если все деструкторы идут по-умолчанию то вообще не по барабану ли, вызываются они или только родительский или вообще ни фига не вызовется?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2014, 22:36     При отсылке на абстрактный класс не запускается программу
Еще ссылки по теме:

C++ Создать класс - данные - абстрактный базовый класс. Создать производные классы
C++ Создать абстрактный базовый класс Тройка чисел с виртуальными методами увеличения на 1. Создать производный класс Время со своими функциями
Абстрактный класс/Класс интерфейс C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.01.2014, 22:36     При отсылке на абстрактный класс не запускается программу #18
Kuzia domovenok, при чем тут учебник? В Стандарте сказано - UB, значит UB, как оно будет себя вести в разных реализациях это проблема реализаций. Зачем нарываться на ошибки (пусть даже явно ты их не наблюдаешь), если их можно избежать просто сделав всё ПРАВИЛЬНО?
И сравнивать деструктор с обычными функциями всё же не стоит. При вызове delete еще и память освобождается помимо выполнения деструктора.
Ты вроде не первый день с C++ знаком, а ведешь себя как дилетант, не веришь божественному писанию Стандарту. Это мне напоминает темы из разряда: "а у меня всё компилируется и результат как надо".
Yandex
Объявления
04.01.2014, 22:36     При отсылке на абстрактный класс не запускается программу
Ответ Создать тему
Опции темы

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