0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 19

Как переделать класс из обычного в абстрактный?

17.10.2011, 12:47. Показов 3936. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Значит дело вот в чем. Есть обычный класс. Написанный полностью и работает хорошо. Но нужно сделать из него абстрактный. Что нужно в него добавить чтобы он таковым считался?
Была бы очень благодарна за помощь.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.10.2011, 12:47
Ответы с готовыми решениями:

Класс: Разработать абстрактный класс класс Point для задания координаты...
Всем привет, помогите пожалуйста решить задачу, я уже всю голову сломал, не знаю как решить... Разработать абстрактный класс класс...

Абстрактный класс, как аргумент функции
добрый день. есть базовый класс Tag внем строковое поле Name есть производные от него класы SmplTag со строковым полем Value и класс...

Как реализовать данный абстрактный класс?
Создать абстрактный класс Function с методом вычисления значения функции y=f(x) в заданной точке. Создать производные классы: Line...

36
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
17.10.2011, 13:53
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Миака Посмотреть сообщение
У нас преподаватель очень формально смотрит, главное, чтобы программа что-нибудь выводила и, соответственно, запускалась, детально в то, что там работает и как она никогда не всматривалась
C++
1
2
3
4
5
6
7
8
9
10
11
class vector {
public:
    ~vector() = 0;
 
// some code
// ...
};
 
int main() {
    vector v;
}
Однозначная ошибка компиляции. Наследоваться придется хотя бы только для того, чтобы показать, что программа вообще компилируется
0
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 19
17.10.2011, 13:55  [ТС]
fasked, у нее в методичке виртуальный деструктор вообще записан как
virtual ~vector ()
0
ниначмуроФ
 Аватар для PointsEqual
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
17.10.2011, 13:55
Цитата Сообщение от fasked Посмотреть сообщение
Так пользоваться все равно не получится таким классом.


Цитата Сообщение от fasked Посмотреть сообщение
Как работоспособность класса-то демонстрировать? И если это вектор, то память как чистить, которая по идее должна выделяться в конструкторе?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
17.10.2011, 13:58
Цитата Сообщение от Миака Посмотреть сообщение
у нее в методичке виртуальный деструктор вообще записан как
virtual ~vector ()
Все верно у нее написано это я сгоряча слово "virtual" забыл. Но, это только виртуальный деструктор и он не делает класс абстрактным. Чтобы сделать класс абстрактным надо дообавить "= 0;".
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
17.10.2011, 14:01
LosAngeles, интересно. А откуда такая цитата?
0
Заблокирован
17.10.2011, 14:06
gooseim, из стандарта. Формально из финального драфта С++11, но в 2003 написано тоже самое, но его у меня нет
0
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 19
17.10.2011, 14:07  [ТС]
fasked, а если дописать просто чистую виртуальную функцию,а не деструктор,тоже работать не будет?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
17.10.2011, 14:22
Цитата Сообщение от Миака Посмотреть сообщение
а если дописать просто чистую виртуальную функцию,а не деструктор,тоже работать не будет?
Как уже не раз было сказано выше, невозможно создать экземпляр абстрактного класса. Попытки создать такой экземпляр всегда будут приводить к ошибкам компиляции. Можно наследоваться и создавать объекты наследуемого класса, можно сделать в абстрактном функцию print чисто виртуальной, а в дочерних классах ее переопределять нужным образом.
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
class vector {
public:
    virtual void print() = 0;
};
 
class vector_console : public vector {
public:
    void print() {
        // for (...)
        //    std::cout << ...
    }
};
 
class vector_logfile : public vector {
public:
    void print() {
        // std::ofstream ofs ...
        // for (...)
        //    ofs << ...
    }
};
 
int main() {
    vector vb; // error
    vector_console vc; // ok
}
Хотя это решение весьма уродливое. Лучше переопределить что-то другое.
Например, если вектор может выделять памяти больше, чем надо в текущий момент, тогда можно было бы выделить как pure-virtual метод, который расчитывает количество памяти. Получилось бы куда более интересней.
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
17.10.2011, 14:25
LosAngeles, а не знаете, с чем это связано. Почему нельзя, чтобы была одна функция?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
17.10.2011, 14:30
Цитата Сообщение от gooseim Посмотреть сообщение
а не знаете, с чем это связано. Почему нельзя, чтобы была одна функция?
it has at least one - имеет по крайнем мере/как минимум/хотя бы одну.
1
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
17.10.2011, 14:36
fasked,
спасибо, надо учить английский.
0
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 19
17.10.2011, 15:34  [ТС]
fasked, спасибо,буду пытаться сделать)
0
Заблокирован
17.10.2011, 17:44
Цитата Сообщение от gooseim Посмотреть сообщение
LosAngeles, а не знаете, с чем это связано. Почему нельзя, чтобы была одна функция?
Это связано лишь с одним: вы не знаете раздела С++, касающегося абстрактных классов! Только и всего!
1
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
17.10.2011, 17:58
Сыроежка, точно. Только и всего.
0
Заблокирован
17.10.2011, 18:17
Цитата Сообщение от gooseim Посмотреть сообщение
Сыроежка, точно. Только и всего.
На самом деле эта общая проблема, состоящая в том, что знания черпаются обычно из различных книг по С++. Когда пишут книги, то очевидно включают лишь тот материал, который считает нужным включить сам автор. А это приводит к тому, что авторы обычно выборочно выбирают материал, и многое остается "за бортом" книги. К тому же проблему усугубляют переводчики, которые порой неправильно передают контекст той или иной фразы. Поэтому действительно можно воспринять информацию об абстрактных классах так, как будто бы все функции должны быть чисто виртуальными.

Я приведу пример подобного заблуждения, который я уже ранее приводил, что многие не знали и не знают, что дружественные функции можно определять внутри класса, который "предоставляет" дружбу, если этот класс не локальный. Но самое забавное, что MS VC++ 2010 содержит баг, не позволяющий определять дружественные функции внутри класса.
В книгах про это тоже обычно нельзя вычитать.
1
 Аватар для aeshes
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
17.10.2011, 21:43
Сыроежка,
Цитата Сообщение от Сыроежка Посмотреть сообщение
Но самое забавное, что MS VC++ 2010 содержит баг, не позволяющий определять дружественные функции внутри класса.
MS VC2010 позволяет определить дружественную функцию внутри класса, т.е. код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
class A
{
    int x;
public:
    A(int _x=0) {x=_x;}
    friend void print(A a)
    {
        cout<<a.x<<endl;
    }
};
 
int main(void)
{
    A a(17);
    print(a);
}
компилируется в вижуалах
0
Заблокирован
18.10.2011, 03:28
у вижуала много проблем особенно шаблонами, вот например не компилируется простенький код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace X
{
template <unsigned N>
void f();
}
 
template <unsigned N>
struct A
{
    friend void X::f <N> ();
};
 
int main ()
{
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.10.2011, 03:28

Как инициализировать абстрактный класс в контейнере vector
Есть абстрактный класс MyDebugger, от него унаследовал два класс MyDebugger1 и MyDebugger2. Мне необходимо хранить объекты унаследованных...

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

Абстрактный класс, наследование, класс хранится в другом классе
Нужна помощь. Написать программу: 1 класс. Имеется абстрактный класс который описывает какую-то сущность, например Человек. В абстрактном...

абстрактный класс как реализовать данные, над которыми методы выполняют какие-либо действия
Абстрактный класс как реализовать данные, над которыми методы выполняют какие-либо действия Задание: форматированный ввод и вывод...

Объясните как объявить абстрактный класс, и при этом не тащить виртуальные методы в производные классы
Суть вопроса - есть у меня класс, который я решаю сделать абстрактным. Как я понимаю что бы сделать класс абстрактным необходимо просто...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Опции темы

Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru