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

Чистые витруальные функции - C++

Восстановить пароль Регистрация
 
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
28.08.2010, 20:59     Чистые витруальные функции #1
Доброго всем времени суток! В процессе изучения C++ натолкнулся на проблему касательно абстрактных классов и виртуальных функций. Вот исходный код:
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
#include <iostream>
#include <cstring>
 
using namespace std;
 
class Publication
{
    private:
        static const int LEN = 40;
        char name[LEN];
        float price;
    public:
        virtual void getData()
        {
            cout << "Введите название: ";
            cin.getline(name, LEN);
            cout << "Введите цену: ";
            cin >> price;
            cin.get();
        }
        virtual void display() const
        {
            cout << "Название: " << name << endl;
            cout << "Цена: " << price << endl;
        }
        virtual bool isOversize() = 0;// {return true;}
};
 
class Book: public Publication
{
    private:
        int pages;
    public:
        void getData()
        {
            Publication::getData();
            cout << "Введите количество страниц: ";
            cin >> pages;
            cin.get();
        }
        void display() const
        {
            Publication::display();
            cout << "Страниц: " << pages << endl;
        }
        bool isOversize() const
        {
            return (pages > 800 ? true : false);
        }
};
 
class Tape: public Publication
{
    private:
        int minutes;
    public:
        void getData()
        {
            Publication::getData();
            cout << "Введите продолжительность в минутах: ";
            cin >> minutes;
            cin.get();
        }
        void display() const
        {
            Publication::display();
            cout << "Продолжительность: " << minutes << " минут(ы)" << endl;
        }
        bool isOversize() const
        {
            return (minutes > 90 ? true : false);
        }
};
 
int main()
{
    Publication* array[100];
    int n = 0;
    char ch;
    do {
        cout << "Книга(b) или запись(t)? -> ";
        cin >> ch;
        cin.get();
        if (ch == 'b')
        {
            array[n] = new Book;
        } else
        {
            array[n] = new Tape;
        }
        array[n++]->getData();
        cout << "Продолжить ввод? (y/n) -> ";
        cin >> ch;
        cin.get();
    } while (ch == 'y');
    
    cout << endl << " === Данные === " << endl;
    
    for (int i = 0; i < n; i++)
    {
        array[i]->display();
        if (array[i]->isOversize())
        {
            cout << "Превышение размера!" << endl;
        }
        cout << endl;
    }
    return 0;
}
Где Publication - абстрактный класс, от кого происходят два других класса: Book и Type. С использованием указателей на базовый класс и употреблении виртуальных функций в getData() и display() проблем не возникло. Но как только я объявил isOversize() чистой виртуальной, то компилятор ругается на new Book и new Type, считая, что они так же являются абстрактными и создать объекты этих классов нельзя:

Код
86 G:\publcation.cpp
cannot allocate an object of type `Book'
86 G:\publcation.cpp
  because the following virtual functions are abstract:
26 G:\publcation.cpp
	virtual bool Publication::isOversize()
Хотя производные классы не используют эту функцию как таковую. Стоит изменить объявление isOversize() на
C++
1
virtual bool isOversize() {return true;}
как всё работает, но при этом можно создать объекты класса Publication.
В чём же моя ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2010, 20:59     Чистые витруальные функции
Посмотрите здесь:

C++ Как из обыной функции вызвать функции член класса?
ввод данных в функции конструктора и использование их в перегруженой функции C++
C++ Заданы три функции. Определить, являются ли эти функции четными или нечетными
C++ Определить конструкторы, функции-члены установки времени, функции получения часа, минуты и секунд
шаблон функции. Задачей функции является округление вышеуказанного вещественного числа с заданной точностью C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
28.08.2010, 21:05     Чистые витруальные функции #2
В классе tape и book объявите функцию так:
C++
1
virtual bool isOversize()
У меня такой вопрос: зачем Вам нужен был const?
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
28.08.2010, 21:06     Чистые витруальные функции #3
модификатор const входит в сигнатуру функции
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
28.08.2010, 21:09     Чистые витруальные функции #4
Забыл const к методу в базовом классе добавить.
C++
1
virtual bool isOversize() const = 0;
Добавлено через 1 минуту
Цитата Сообщение от Евгений М. Посмотреть сообщение
У меня такой вопрос: зачем Вам нужен был const?
Ну это вполне логично, если данные класса не изменяются, то указатель this надо сделать константным.
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
28.08.2010, 21:11  [ТС]     Чистые витруальные функции #5
fasked, спасибо, помогло
Я так понимаю, объявление чистой виртуальной функции до = 0 должно совпадать с объявлением такой же функции в производных классах?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
28.08.2010, 21:13     Чистые витруальные функции #6
Цитата Сообщение от k1ry4 Посмотреть сообщение
Я так понимаю, объявление чистой виртуальной функции до = 0 должно совпадать с объявлением такой же функции в производных классах?
Да, как Aye Aye уже сказал модификатор const входит в сигнатуру.
Yandex
Объявления
28.08.2010, 21:13     Чистые витруальные функции
Ответ Создать тему
Опции темы

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