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

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

Войти
Регистрация
Восстановить пароль
 
 
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
#1

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

04.01.2014, 06:03. Просмотров 396. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2014, 06:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос При отсылке на абстрактный класс не запускается программу (C++):

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

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

Класс: Создать абстрактный базовый класс Figure с виртуальными методами вычисления площади и периметра. - C++
Создать абстрактный базовый класс Figure с виртуальными методами вычисления площади и периметра. Создать производные классы: Rectangle...

Абстрактный класс, наследование, класс хранится в другом классе - C++
Нужна помощь. Написать программу: 1 класс. Имеется абстрактный класс который описывает какую-то сущность, например Человек. В абстрактном...

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

Абстрактный класс/Класс интерфейс - C++
Не ловлю суть в чем разница между интерфейсом и абстрактным классом. И там и там у методов нету реализации. Ну интерфейс задает набор...

17
0x10
2486 / 1661 / 249
Регистрация: 24.11.2012
Сообщений: 4,139
04.01.2014, 07:02 #2
Нет реализации метода Use в наследнике.
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.01.2014, 11:19 #3
mster-doc, потому что константный метод и неконстантный метод - это разные методы. Даже если у них название одинаковое. В таких случаях как раз было бы полезно ключевое слово override из c++11.
1
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 есть какая ни будь специальная библиотека, просто мне компилятор на него и жалуется.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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.
1
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;
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.01.2014, 16:20 #7
mster-doc, потому что где реализация ?
1
zss
Модератор
Эксперт С++
6586 / 6148 / 2025
Регистрация: 18.12.2011
Сообщений: 16,027
Завершенные тесты: 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();
1
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();
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.01.2014, 18:15 #10
Цитата Сообщение от zss Посмотреть сообщение
Нужно так
Нужно ещё виртуальный деструктор добавить, иначе UB.
Цитата Сообщение от mster-doc Посмотреть сообщение
А как можно объединить функции?
Вызывать из дочернего класса базовую или в каком плане объединить?
1
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
04.01.2014, 18:27  [ТС] #11
[QUOTE=Tulosba;5593381]Нужно ещё виртуальный деструктор добавить, иначе UB.[QUOTE]
???

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

Не по теме:

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

0
Kuzia domovenok
2078 / 1907 / 176
Регистрация: 25.03.2012
Сообщений: 6,572
Записей в блоге: 1
04.01.2014, 18:58 #13
Цитата Сообщение от Tulosba Посмотреть сообщение
Нужно ещё виртуальный деструктор добавить, иначе UB.
зачем?
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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.
1
Kuzia domovenok
2078 / 1907 / 176
Регистрация: 25.03.2012
Сообщений: 6,572
Записей в блоге: 1
04.01.2014, 21:08 #15
Tulosba, и нафига? Если в моей программе все деструкторы по-умолчанию(как у автора), нафига добавлять виртуальный дестр-р? Покажи мне хоть один компилятор, который вызовет UB (а именно что-то иное помимо деструкторов по-умолчанию в такой программе)

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

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
ISO/IEC 14882:2011
это вообще не С++, а С++11
1
04.01.2014, 21:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2014, 21:08
Привет! Вот еще темы с ответами:

Создать класс - данные - абстрактный базовый класс. Создать производные классы - C++
Всем привет! У меня вот такая проблема.... Создать класс - данные - абстрактный базовый класс. Создать производные классы - данные типа...

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

Абстрактный класс - C++
вот у меня есть классы: class CCommand { public: virtual ~CCommand() {}; virtual void execute(CShape *selection)=0; virtual...

Абстрактный класс - C++
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; #include &lt;windows.h&gt; char bufRus; char* Rus(const char* text) { ...


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

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

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