Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/16: Рейтинг темы: голосов - 16, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 19

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

17.10.2011, 12:47. Показов 3873. Ответов 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
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru