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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
PointsEqual
ниначмуроФ
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
#1

Абстрактный класс. Наследование - C++

23.09.2010, 23:56. Просмотров 1122. Ответов 13
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class polygon{
        int height, width, point p;
        e_color color;
    public:
        virtual ~polygon(){}
        virtual void draw() = 0;
        virtual void move() = 0;
        virtual void rotation() = 0;
};
 
class square: public polygon{
 
};
 
class line: public polygon{
 
};
 
class 3e: public polygon{
 
};
поясните......

В абстрактном классе нежелательно заводить поля? (int height, width, point p; e_color color)

тогда мне их объявлять надо в каждом производном ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2010, 23:56     Абстрактный класс. Наследование
Посмотрите здесь:

C++ абстрактный класс
Абстрактный класс C++
C++ Абстрактный базовый класс и множественное наследование (либо иерархия классов)
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... C++
C++ Абстрактный класс
Наследование и абстрактный класс C++
C++ Создать класс - данные - абстрактный базовый класс. Создать производные классы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
24.09.2010, 00:05     Абстрактный класс. Наследование #2
нежелательны те, которые по смыслу не должны быть у всех наследников, иначе это ухудшает архитектуру
общим для всех наследников будет только e_color color - его можно в абстрактном оставить
а остальные и объявлять в потомках

Добавлено через 5 минут
Цитата Сообщение от PointsEqual Посмотреть сообщение
virtual ~polygon(){}
можно не объявлять чисто виртуальным, чтобы потомки могли иметь право не переопределять деструктор
e_color color; надо перенести в protected естественно
PointsEqual
ниначмуроФ
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
24.09.2010, 00:25  [ТС]     Абстрактный класс. Наследование #3
Цитата Сообщение от alex_x_x Посмотреть сообщение
e_color color; надо перенести в protected естественно
точно.

Добавлено через 18 минут
компилятор волнуется что деструктор не виртуальный)
IchMors
97 / 93 / 4
Регистрация: 16.05.2010
Сообщений: 310
24.09.2010, 00:56     Абстрактный класс. Наследование #4
Цитата Сообщение от PointsEqual Посмотреть сообщение
компилятор волнуется что деструктор не виртуальный)
при использовании виртуальных функций - деструктор также должен быть виртуальным)
Nick Alte
Эксперт С++
1603 / 995 / 118
Регистрация: 27.09.2009
Сообщений: 1,918
Завершенные тесты: 1
24.09.2010, 18:00     Абстрактный класс. Наследование #5
Точнее говоря, деструктор должен быть тогда, когда мы уничтожаем созданные с помощью new объекты производных классов через указатели на базовый. Что в большинстве случаев и происходит при использовании виртуальных функций (хотя взаимосвязь не стопроцентная).
Mr.X
Эксперт С++
3039 / 1684 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
24.09.2010, 19:51     Абстрактный класс. Наследование #6
Цитата Сообщение от alex_x_x Посмотреть сообщение
можно не объявлять чисто виртуальным, чтобы потомки могли иметь право не переопределять деструктор
Не получится, так как деструктор не наследуется. Даже если вы его "не переопределите" в потомке, компилятор его сам создаст.
PointsEqual
ниначмуроФ
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
24.09.2010, 20:43  [ТС]     Абстрактный класс. Наследование #7
а если в абстрактном классе есть массив field
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class polygon{
    protected:
        e_color color;
        int field[col][row];
 
    public:
        polygon(){
            for (int i = 0; i < row; ++i)
                for (int j = 0; j < col; ++j)
                    field[i][j] = 0;
        }
        virtual ~polygon(){}
        virtual void draw() = 0;
        virtual void move(int) = 0;
        virtual void rotation() = 0;
};
можно ли его так инициализировать в конструкторе?
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.09.2010, 22:26     Абстрактный класс. Наследование #8
Цитата Сообщение от PointsEqual Посмотреть сообщение
можно ли его так инициализировать в конструкторе?
До выхода C++0x - нет.
PointsEqual
ниначмуроФ
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
24.09.2010, 22:26  [ТС]     Абстрактный класс. Наследование #9
CyBOSSeR, а как инициализировать?
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.09.2010, 22:32     Абстрактный класс. Наследование #10
Цитата Сообщение от PointsEqual Посмотреть сообщение
CyBOSSeR, а как инициализировать?
Также как ты и делаешь сейчас:
Цитата Сообщение от PointsEqual Посмотреть сообщение
C++
1
2
3
for (int i = 0; i < row; ++i)
  for (int j = 0; j < col; ++j)
    field[i][j] = 0;
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
24.09.2010, 22:34     Абстрактный класс. Наследование #11
C++
1
memset( field, 0, sizeof(field) );
PointsEqual
ниначмуроФ
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
24.09.2010, 22:39  [ТС]     Абстрактный класс. Наследование #12
Цитата Сообщение от alex_x_x Посмотреть сообщение
memset( field, 0, sizeof(field) );
Это я так понимаю в конструкторе надо написать?
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.09.2010, 22:40     Абстрактный класс. Наследование #13
PointsEqual, это инициализация поля, являющегося POD'ом (встроенные типы, структуры и т.п.), нулями. Да, в конструкторе.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2010, 22:40     Абстрактный класс. Наследование
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
24.09.2010, 22:40     Абстрактный класс. Наследование #14
логично было бы, а так где угодно
Yandex
Объявления
24.09.2010, 22:40     Абстрактный класс. Наследование
Ответ Создать тему
Опции темы

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