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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Где находиться папка Source Files в MSVS 2010 http://www.cyberforum.ru/cpp-beginners/thread162180.html
Где находиться кнопка sources file? ( версия eng)
C++ Прочитать файл и отсортировать его по алфавиту Помогите пожалуйста сделать следующее задание: Есть текстовый файл input.txt, в нем есть несколько строк. Нужно прочитать этот файл, отсортировать строки по алфавиту и записать в файл output.txt.... http://www.cyberforum.ru/cpp-beginners/thread162137.html
delete указателя C++
valueOfWordS - указатель, член класса String_value, конструктору же этого класса передается указатель на переменную того же типа: String_value::String_value(int* value_pointer) { ...
C++ Нужен совет в программе!
Програма такого типа: 1.Вивести в левый угол екрана компютера в столбик 5 слов разного цвета! 2.Обеспечить изменение цветах фона экрана при нажатии любой клавиши Вот первый пункт програмы: Код:...
C++ Определение типа через typedef http://www.cyberforum.ru/cpp-beginners/thread162072.html
То-ли я пересидел, то-ли я просто этого не знаю, но все же. Через typedef определить 1) массив из 7 указателей на целые числа. Как не через тайпдеф знаю - int*arr; А вот как через него - хз... 2)...
C++ Динамический массив Я постоянно работаю с динамическими массивами в Object Pascal и PHP. Вот внезапно возникла необходимость использования языка C++ и пришлось немного почесать голову )). :confused: Библиотека... подробнее

Показать сообщение отдельно
yanyk1n
4329 / 1460 / 152
Регистрация: 12.03.2009
Сообщений: 5,310

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

28.08.2010, 20:59. Просмотров 516. Ответов 5
Метки (Все метки)

Доброго всем времени суток! В процессе изучения 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.
В чём же моя ошибка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru