Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/46: Рейтинг темы: голосов - 46, средняя оценка - 4.70
5980 / 2106 / 737
Регистрация: 10.12.2010
Сообщений: 5,923
Записей в блоге: 3
1

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

18.03.2012, 15:51. Просмотров 8373. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2012, 15:51
Ответы с готовыми решениями:

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

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

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

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

7
2224 / 1728 / 864
Регистрация: 21.12.2010
Сообщений: 3,073
Записей в блоге: 11
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
5980 / 2106 / 737
Регистрация: 10.12.2010
Сообщений: 5,923
Записей в блоге: 3
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
Эксперт С++
5813 / 3465 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
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
Эксперт С++
5813 / 3465 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
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
5980 / 2106 / 737
Регистрация: 10.12.2010
Сообщений: 5,923
Записей в блоге: 3
18.03.2012, 17:10  [ТС] 6
Nameless One, спасибо за разъяснение. Теперь такой вопрос: на что влияет модификатор const в данном случае?
0
Эксперт С++
5813 / 3465 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
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
Don't worry, be happy
16958 / 9837 / 1895
Регистрация: 27.09.2012
Сообщений: 24,392
Записей в блоге: 2
14.03.2013, 15:57 8
В дополнение к посту 7 - в константных методах можно изменять mutable поля.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2013, 15:57

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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