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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.67
HighPredator
5474 / 1840 / 342
Регистрация: 10.12.2010
Сообщений: 5,431
Записей в блоге: 3
#1

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

18.03.2012, 15:51. Просмотров 5303. Ответов 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) как его применять и где?
Заранее спасибо!
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igorrr37
1644 / 1272 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
18.03.2012, 16:37     Чисто виртуальные классы. Модификатор const #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;
}
HighPredator
5474 / 1840 / 342
Регистрация: 10.12.2010
Сообщений: 5,431
Записей в блоге: 3
18.03.2012, 17:01  [ТС]     Чисто виртуальные классы. Модификатор const #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, ваш код, кстати, тоже.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
18.03.2012, 17:04     Чисто виртуальные классы. Модификатор const #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;
}
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
18.03.2012, 17:09     Чисто виртуальные классы. Модификатор const #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 минуты
А ругался компилятор потому, что в классе-потомке не переопределялась «чистая» функция, а определялось ее неконстантная перегрузка. Таким образом, класс-потомок тоже становился абстрактным, что и приводило к ошибке компиляции
HighPredator
5474 / 1840 / 342
Регистрация: 10.12.2010
Сообщений: 5,431
Записей в блоге: 3
18.03.2012, 17:10  [ТС]     Чисто виртуальные классы. Модификатор const #6
Nameless One, спасибо за разъяснение. Теперь такой вопрос: на что влияет модификатор const в данном случае?
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
18.03.2012, 17:18     Чисто виртуальные классы. Модификатор const #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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2013, 15:57     Чисто виртуальные классы. Модификатор const
Еще ссылки по теме:
виртуальные классы C++
C++ виртуальные базовые классы
Виртуальные функции и классы C++
C++ Абстрактные классы. Виртуальные функции
C++ Виртуальные функции. Абстрактные классы.

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
14.03.2013, 15:57     Чисто виртуальные классы. Модификатор const #8
В дополнение к посту 7 - в константных методах можно изменять mutable поля.
Yandex
Объявления
14.03.2013, 15:57     Чисто виртуальные классы. Модификатор const
Ответ Создать тему
Опции темы

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