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

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

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

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

23.09.2010, 23:56. Просмотров 1153. Ответов 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++
Нужна помощь. Написать программу: 1 класс. Имеется абстрактный класс который описывает какую-то сущность, например Человек. В абстрактном...

Наследование и абстрактный класс - C++
Вот сделал список с такими условиями #include <iostream> #include <conio.h> #include <string> using namespace std; ...

Абстрактный базовый класс и множественное наследование - C++
Общая постановка. Создать программу с абстрактным базовым классом и множественным наследованием. Помогите разобраться почему не работает,...

Абстрактный класс, одиночное наследование, далее множественное - C++
Добрый вечер! никак не могу найти информацию о том, как правильно реализуется следующее действие: есть абстрактный класс А, от него...

Абстрактный базовый класс и множественное наследование (либо иерархия классов) - C++
Помогите пожалуйста с задачей. Кое-что написал но еще далеко не все. Все ли пока правильно? Мобильные телефоны (наименование,...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
24.09.2010, 00:05 #2
нежелательны те, которые по смыслу не должны быть у всех наследников, иначе это ухудшает архитектуру
общим для всех наследников будет только e_color color - его можно в абстрактном оставить
а остальные и объявлять в потомках

Добавлено через 5 минут
Цитата Сообщение от PointsEqual Посмотреть сообщение
virtual ~polygon(){}
можно не объявлять чисто виртуальным, чтобы потомки могли иметь право не переопределять деструктор
e_color color; надо перенести в protected естественно
PointsEqual
ниначмуроФ
835 / 519 / 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
Эксперт С++
1636 / 1008 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
24.09.2010, 18:00 #5
Точнее говоря, деструктор должен быть тогда, когда мы уничтожаем созданные с помощью new объекты производных классов через указатели на базовый. Что в большинстве случаев и происходит при использовании виртуальных функций (хотя взаимосвязь не стопроцентная).
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
24.09.2010, 19:51 #6
Цитата Сообщение от alex_x_x Посмотреть сообщение
можно не объявлять чисто виртуальным, чтобы потомки могли иметь право не переопределять деструктор
Не получится, так как деструктор не наследуется. Даже если вы его "не переопределите" в потомке, компилятор его сам создаст.
PointsEqual
ниначмуроФ
835 / 519 / 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++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.09.2010, 22:26 #8
Цитата Сообщение от PointsEqual Посмотреть сообщение
можно ли его так инициализировать в конструкторе?
До выхода C++0x - нет.
PointsEqual
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
24.09.2010, 22:26  [ТС] #9
CyBOSSeR, а как инициализировать?
CyBOSSeR
Эксперт C++
2300 / 1670 / 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
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
24.09.2010, 22:34 #11
C++
1
memset( field, 0, sizeof(field) );
PointsEqual
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
24.09.2010, 22:39  [ТС] #12
Цитата Сообщение от alex_x_x Посмотреть сообщение
memset( field, 0, sizeof(field) );
Это я так понимаю в конструкторе надо написать?
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.09.2010, 22:40 #13
PointsEqual, это инициализация поля, являющегося POD'ом (встроенные типы, структуры и т.п.), нулями. Да, в конструкторе.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
24.09.2010, 22:40 #14
логично было бы, а так где угодно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2010, 22:40
Привет! Вот еще темы с ответами:

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

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

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

Наследование: базовый класс Квадрат, производный класс Пирамида - C++
Помогите, пожалуйста!:cry: Добавлено через 6 минут Создать класс КВАДРАТ, член класса- длинна стороны. Предусмотреть в классе методы...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.09.2010, 22:40
Ответ Создать тему
Опции темы

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