Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для mster-doc
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 244

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

04.01.2014, 06:03. Показов 952. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. При отсылке на абстрактный класс не могу запустить программу.
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'
потому следующие виртуальные функции аннотация:
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.01.2014, 06:03
Ответы с готовыми решениями:

Добавить в программу абстрактный класс
Помогите, пожалуйста, нужно изменить класс mass на абстрактный #include &quot;iostream&quot; using namespace std; class mass { ...

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ...
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...

Класс: Разработать абстрактный класс класс Point для задания координаты...
Всем привет, помогите пожалуйста решить задачу, я уже всю голову сломал, не знаю как решить... Разработать абстрактный класс класс...

17
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
04.01.2014, 07:02
Нет реализации метода Use в наследнике.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.01.2014, 11:19
mster-doc, потому что константный метод и неконстантный метод - это разные методы. Даже если у них название одинаковое. В таких случаях как раз было бы полезно ключевое слово override из c++11.
1
 Аватар для mster-doc
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 244
04.01.2014, 14:17  [ТС]
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 есть какая ни будь специальная библиотека, просто мне компилятор на него и жалуется.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.01.2014, 14:24
mster-doc, короче говоря, сделайте так в E_Talon:
C++
1
2
   virtual void Use() /* const */ = 0;
   //virtual void Add() const = 0;
Добавлено через 1 минуту
Цитата Сообщение от mster-doc Посмотреть сообщение
а под override есть какая ни будь специальная библиотека
компилятор должен поддерживать стандарт C++11.
1
 Аватар для mster-doc
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 244
04.01.2014, 15:35  [ТС]
а почему, если я делаю ещё одну виртуальную функцию, то код уже опять не работает?

C++
1
2
virtual void Use() /* const */ = 0;
virtual void Add() /* const */ = 0;
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.01.2014, 16:20
mster-doc, потому что где реализация ?
1
Модератор
Эксперт С++
 Аватар для zss
13766 / 10960 / 6490
Регистрация: 18.12.2011
Сообщений: 29,234
04.01.2014, 16:28
Еще один нюанс:
Цитата Сообщение от 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();
1
 Аватар для mster-doc
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 244
04.01.2014, 16:35  [ТС]
А как можно объединить функции? Просто у меня функция 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();
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.01.2014, 18:15
Цитата Сообщение от zss Посмотреть сообщение
Нужно так
Нужно ещё виртуальный деструктор добавить, иначе UB.
Цитата Сообщение от mster-doc Посмотреть сообщение
А как можно объединить функции?
Вызывать из дочернего класса базовую или в каком плане объединить?
1
 Аватар для mster-doc
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 244
04.01.2014, 18:27  [ТС]
[QUOTE=Tulosba;5593381]Нужно ещё виртуальный деструктор добавить, иначе UB.[QUOTE]
???

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

Не по теме:

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

0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
04.01.2014, 18:58
Цитата Сообщение от Tulosba Посмотреть сообщение
Нужно ещё виртуальный деструктор добавить, иначе UB.
зачем?
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.01.2014, 19:29
Цитата Сообщение от 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.
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
04.01.2014, 21:08
Tulosba, и нафига? Если в моей программе все деструкторы по-умолчанию(как у автора), нафига добавлять виртуальный дестр-р? Покажи мне хоть один компилятор, который вызовет UB (а именно что-то иное помимо деструкторов по-умолчанию в такой программе)

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

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
ISO/IEC 14882:2011
это вообще не С++, а С++11
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.01.2014, 21:33
Kuzia domovenok, зачем спорить со Стандартом? C++11 современная версия C++. Посмотри для интереса 2003 или 1998, если думаешь, что там было иначе с данным моментом.
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
04.01.2014, 21:54
Tulosba, а по теме что? любой учебник С++ в главе "зачем нужны виртуальные функции" говорит, что без виртуальных функций при обращению к объекту класса по указателю на родителя будут вызываться родительские методы, даже если указатель указывает на объект производного класса. Это не баг, а фича.
С деструкторами та же самая история! Будет вызван деструктор родительский и всё. Если все деструкторы идут по-умолчанию то вообще не по барабану ли, вызываются они или только родительский или вообще ни фига не вызовется?
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.01.2014, 22:36
Kuzia domovenok, при чем тут учебник? В Стандарте сказано - UB, значит UB, как оно будет себя вести в разных реализациях это проблема реализаций. Зачем нарываться на ошибки (пусть даже явно ты их не наблюдаешь), если их можно избежать просто сделав всё ПРАВИЛЬНО?
И сравнивать деструктор с обычными функциями всё же не стоит. При вызове delete еще и память освобождается помимо выполнения деструктора.
Ты вроде не первый день с C++ знаком, а ведешь себя как дилетант, не веришь божественному писанию Стандарту. Это мне напоминает темы из разряда: "а у меня всё компилируется и результат как надо".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.01.2014, 22:36
Помогаю со студенческими работами здесь

Объясните как объявить абстрактный класс, и при этом не тащить виртуальные методы в производные классы
Суть вопроса - есть у меня класс, который я решаю сделать абстрактным. Как я понимаю что бы сделать класс абстрактным необходимо просто...

Клиент-сервер: При передаче одного кадра все хорошо, но при отсылке потоком возникает ряд ошибок
Добрый день, коллеги. Пишу клиент-серверное приложение для передачи потокового видео. Сервер на linux, клиент на win. Данные с камеры...

Как указать кодировку при отсылке писем?
Добрый день! Не подскажите как указать кодировку при отсылке писем? я пишу Set Mail = Server.CreateObject('Persits.MailSender')...

Php при отсылке выдает открыть/сохранить
помогите разобраться! только учусь. установил Denwer, вроде все работает, но при обращении к файлу php в експлоуре выдает окно...

Куда попадут данные при отсылке их не в формате Get запроса?
Добрый день! имею модуль Sim800, который может устанавливать соединение по адресу типа www. mainсайт..... на сайте есть страница PHP...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru