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

Выполнение не той функции при наследовании - C++

Восстановить пароль Регистрация
 
Султан
4 / 4 / 1
Регистрация: 11.03.2012
Сообщений: 114
23.03.2012, 00:02     Выполнение не той функции при наследовании #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
#pragma hdrstop
 
#include <iostream.h>
#include <conio.h>
#include <tchar.h>
#include <string>
//---------------------------------------------------------------------------
class publication
{
  protected:
    string name;
    float symm;
  public:
    void getdata()
    {
      wcout<<L"Введите название книги: ";
      getline(cin,name);
      wcout<<L"Введите ее цену:        ";
      cin>>symm;
    }
 
    void showdata() const
    {
      cout<<"-------------------------------------";
      wcout<<L"\n\nКнига: ";cout<< name <<endl;
      wcout<<L"Цена:  " << symm<<L"р."<<endl;
      cin.get();
    }
};
 
class publication2 : public publication
{
  protected:
    int dd;
    int mm;
    int gggg;
  public:
    publication2():dd(0),mm(0),gggg(0){}
 
    void getdate()
    {
      publication::getdata();
      char sim = '/';
      wcout << L"Введите дату в формате dd/mm/gggg\n";
      cin >> dd >> sim >> mm >> sim >> gggg;
    }
 
    void showdate()const
    {
      publication::showdata();
      char sim = '/';
      wcout << L"Дата выхода: " << dd<<sim<<mm<<sim<<gggg;
        }
};
 
class book : public publication2
{
  private:
    int srtan;
  public:
    void getdata()
    {
      publication2::getdata();
      wcout<<L"Введите колличество страниц в книге: ";
      cin>>srtan;
 
    }
 
    void showdata() const
    {
      publication2::showdata();
      wcout<<L"Колличество страниц: "<<srtan<<L" стр."<<endl;
 
    }
};
 
class type : public publication2
{
  private:
    float min;
  public:
    void getdata()
    {
      publication2::getdata();
      wcout<<L"Введите длинну аудиокниги: ";
      cin>>min;
    }
 
    void showdata() const
    {
      publication2::showdata();
      wcout<<L"Длинна аудиокниги: "<<min<<L" мин."<<endl;
    }
};
 
#pragma argsused
int main(int argc, _TCHAR* argv[])
{
  wcout.imbue(locale(".866"));
 
  type k1;
  book k2;
  k1.getdata();
  k1.showdata();
  k2.getdata();
  k2.showdata();
 
  system("pause");
  return 0;
}
//---------------------------------------------------------------------------
При выполнении publication2::getdata(); выполняется функция publication::getdata(); что в принципе не правильно,но почему не могу разобраться.
Сначала было дано 3 класса : publication,type и book.затем добавил publication2 в котором вводиться дата.
Помогите решить проблему.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2012, 00:02     Выполнение не той функции при наследовании
Посмотрите здесь:

C++ Ошибка при наследовании
C++ Ошибка при наследовании
C++ Ошибка при наследовании
Конструкторы при наследовании C++
Конструкторы при наследовании C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
23.03.2012, 00:13     Выполнение не той функции при наследовании #2
Цитата Сообщение от Султан Посмотреть сообщение
При выполнении publication2::getdata(); выполняется функция publication::getdata();
так вы сами указали в publication2::getdata() выполнить сначала publication::getdata()
Султан
4 / 4 / 1
Регистрация: 11.03.2012
Сообщений: 114
23.03.2012, 00:20  [ТС]     Выполнение не той функции при наследовании #3
Ну так затем должно выполняться
C++
1
2
3
char sim = '/';
wcout << L"Введите дату в формате dd/mm/gggg\n";
cin >> dd >> sim >> mm >> sim >> gggg;
Но этого не происходит.
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
23.03.2012, 00:30     Выполнение не той функции при наследовании #4
void publication::getdata() разве не должна объявляться виртуальной в базовом классе, если планируется переопределения в классе наследнике?
P.S. аналогично нужно virtual и для showdata()
Султан
4 / 4 / 1
Регистрация: 11.03.2012
Сообщений: 114
23.03.2012, 00:35  [ТС]     Выполнение не той функции при наследовании #5
Ем.Я еще не дошел до виртуальных функций)Это будет глывы через 2...А пока что только так умею.

В книге просто сказано создать класс publication2,который бы являлся производным publication,и изменить 2 последних,что бы они стали производными publication2.
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
23.03.2012, 00:39     Выполнение не той функции при наследовании #6
Насколько я помню так не правильно, обязательно нужно добавить virtual, иначе бред.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2012, 02:51     Выполнение не той функции при наследовании
Еще ссылки по теме:

Возвращение массива из функции при наследовании C++
Виртуальные функции при наследовании C++
C++ Присвоение при наследовании

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

Или воспользуйтесь поиском по форуму:
Султан
4 / 4 / 1
Регистрация: 11.03.2012
Сообщений: 114
23.03.2012, 02:51  [ТС]     Выполнение не той функции при наследовании #7
Еще бы знать куда и зачем)И почему оно так не работает.

Добавлено через 1 час 49 минут
Хм.Изменил в наследовании классов public на private, т.е class publication2 : private publication
Стал выдавать ошибку в publication2::getdate();
Просто удалил ее и написал заново...и заработало.Чудеса да и только.
Yandex
Объявления
23.03.2012, 02:51     Выполнение не той функции при наследовании
Ответ Создать тему
Опции темы

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