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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.67
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,450
Записей в блоге: 2
#1

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

18.03.2012, 15:51. Просмотров 5371. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2012, 15:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чисто виртуальные классы. Модификатор const (C++):

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

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

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

Модификатор const в аргументах функций - C++
Постоянно путаюсь в этих константах. Как писать грамотнее? Вот так: template<typename TypeT> void...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
igorrr37
1647 / 1275 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
18.03.2012, 16:37 #2
чтобы инстанцировать, надо реализовать все чисто виртуальные методы
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
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,450
Записей в блоге: 2
18.03.2012, 17:01  [ТС] #3
Цитата Сообщение от 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;
}
Так вот это не компилируется со словами:
Код
error C2259: 'B' : cannot instantiate abstract class
Добавлено через 1 минуту
igorrr37, ваш код, кстати, тоже.
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
18.03.2012, 17:04 #4
Все логично. Сигнатура метода 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
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
18.03.2012, 17:09 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,450
Записей в блоге: 2
18.03.2012, 17:10  [ТС] #6
Nameless One, спасибо за разъяснение. Теперь такой вопрос: на что влияет модификатор const в данном случае?
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
18.03.2012, 17:18 #7
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
Эксперт CЭксперт С++
13214 / 7485 / 843
Регистрация: 27.09.2012
Сообщений: 18,401
Записей в блоге: 3
Завершенные тесты: 1
14.03.2013, 15:57 #8
В дополнение к посту 7 - в константных методах можно изменять mutable поля.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2013, 15:57
Привет! Вот еще темы с ответами:

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

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

Виртуальные базовые классы - C++
Необходимо написать примеры с комментариями использования виртуальных базовых классов

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


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

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

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