Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/54: Рейтинг темы: голосов - 54, средняя оценка - 4.76
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3

Чисто виртуальные классы. Модификатор const

18.03.2012, 15:51. Показов 11411. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех! Известно, что чисто виртуальный (абстрактный) класс можно получить
следующим образом.
C++
1
2
3
4
5
class A
{
public:
    virtual void test()=0;
};
На просторах рунета в онлайн-учебнике встретил следующий пример абстрактного класса:
C++
1
2
3
4
5
class A
{
public:
    virtual void test()const=0;
};
И получается так, что я ничего даже с его наследниками не могу сделать. Попытка инстанцировать наследника пресекается компилятором. Отсюда вопросы:
1) что это за чудо?
2) как его применять и где?
Заранее спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.03.2012, 15:51
Ответы с готовыми решениями:

Модификатор const для параметра функции не const?
void foo(const int N) { int Arr; //<-- ??? } В clang это работает. В VisualStudio 2015 нет.

Виртуальные и чисто виртуальные функции
Чем они отличаются?? если можно, с примерами. И как из виртуальной функции сделать чисто виртуальную? #include <iostream> using...

Модификатор доступа const
Здравсвуйте, прошу помочь с вопросом. В общем имеется такой класс: class Animator : public sf::Drawable { private: ...

7
 Аватар для igorrr37
2878 / 2025 / 991
Регистрация: 21.12.2010
Сообщений: 3,763
Записей в блоге: 10
18.03.2012, 16:37
чтобы инстанцировать, надо реализовать все чисто виртуальные методы
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
#include <iostream>
#include <memory>
 
class Animal
{
public:
    virtual void CanItFly() const = 0;
    virtual ~Animal()
    {
        std::cout << "~Animal\n";
    }
};
 
class Cow : public Animal
{
public:
    virtual void CanItFly() 
    {
        std::cout << "No\n";
    }
    virtual ~Cow()
    {
        std::cout << "~Cow\n";
    }
};
 
int main()
{
    std::unique_ptr<Animal> pa(new Cow);
    pa -> CanItFly();
    return 0;
}
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
18.03.2012, 17:01  [ТС]
Цитата Сообщение от igorrr37 Посмотреть сообщение
надо реализовать все чисто виртуальные методы
Ну вот, например:
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
#include<iostream>
 
using namespace std;
 
class A
{
public:
    virtual void test()const=0;
};
 
class B:public A
{
public:
    virtual void test();
};
 
void B::test()
{
    cout<<"In class B!"<<endl;
}
 
int main()
{
    B t;
    t.test();
    return 0;
}
Так вот это не компилируется со словами:
Code
1
error C2259: 'B' : cannot instantiate abstract class
Добавлено через 1 минуту
igorrr37, ваш код, кстати, тоже.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
18.03.2012, 17:04
Все логично. Сигнатура метода test класса A не совпадает с сигнатурой метода test класса B

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
#include<iostream>
 
using namespace std;
 
class A
{
public:
        virtual void test()const=0;
};
 
class B:public A
{
public:
        virtual void test() const;
};
 
void B::test() const
{
        cout<<"In class B!"<<endl;
}
 
int main()
{
        B t;
        t.test();
        return 0;
}
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
18.03.2012, 17:09
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от HighPredator Посмотреть сообщение
igorrr37, ваш код, кстати, тоже.
все то же самое:
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
#include <iostream>
#include <memory>
 
class Animal
{
public:
    virtual void CanItFly() const = 0;
    virtual ~Animal()
    {
        std::cout << "~Animal\n";
    }
};
 
class Cow : public Animal
{
public:
    virtual void CanItFly() const
    {
        std::cout << "No\n";
    }
    virtual ~Cow()
    {
        std::cout << "~Cow\n";
    }
};
 
int main()
{
    std::unique_ptr<Animal> pa(new Cow);
    pa -> CanItFly();
    return 0;
}
Добавлено через 2 минуты
А ругался компилятор потому, что в классе-потомке не переопределялась «чистая» функция, а определялось ее неконстантная перегрузка. Таким образом, класс-потомок тоже становился абстрактным, что и приводило к ошибке компиляции
4
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
18.03.2012, 17:10  [ТС]
Nameless One, спасибо за разъяснение. Теперь такой вопрос: на что влияет модификатор const в данном случае?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
18.03.2012, 17:18
HighPredator, он говорит, что метод не меняет поля класса, и, следовательно, он может вызываться для константных экземпляров класса.

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
#include <iostream>
 
class Foo
{
    int _i;
    
public:
    Foo(int i)
    : _i(i)
    {
    }
 
    // неконстантный метод: изменяет поле _i экземпляра
    int set(int i)
    {
    return _i = i;
    }
 
    // константный метод: не изменяет поле _i
    int get() const
    {
    return _i;
    }
};
    
int main()
{
    const Foo f(3);
    Foo g(5);
    
    std::cout << f.get() << std::endl;
 
    // ошибка компиляции (f - константа):
    // std::cout << f.set(5) << std::endl;
 
    // тут ошибки нет
    std::cout << g.set(8) << std::endl;
}
1
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
14.03.2013, 15:57
В дополнение к посту 7 - в константных методах можно изменять mutable поля.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.03.2013, 15:57
Помогаю со студенческими работами здесь

Модификатор const в аргументах функций
Постоянно путаюсь в этих константах. Как писать грамотнее? Вот так: template&lt;typename TypeT&gt; void...

Модификатор const Очередные грабли с++?
Представленный ниже код не компилируется. В чем здесь может быть проблема? class CFirst { public: int GetValue() { return...

Модификатор const в качестве возвращаемого значения
const int get_size(const int&amp; a) { return a; } int main() { const int size = get_size(5);

Описание чисто виртуальных методов, Абстрактные классы
Здравствуйте. Изучаю наследование, абстрактные классы. Возникло два вопроса: 1. Видел несколько примеров, вопрос - чем отличаются...

виртуальные классы
Не могу понять в чем ошибка, помогите исправить. Построить иерархию классов согласно схеме наследования. Каждый класс должен содержать...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru