Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
gorus95
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 169
Завершенные тесты: 1
1

Описание чисто виртуальных методов, Абстрактные классы

03.11.2013, 14:56. Просмотров 719. Ответов 10
Метки нет (Все метки)

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

1. Видел несколько примеров, вопрос - чем отличаются вот таких два описания чисто виртуальной функции. Нигде не нашел на что влияет этот const.
C++
1
2
3
public:
virtual void GetArea() = 0;
virtual void GetArea() const = 0;
2. Ранее я описал класс "Коробка" с полями "название", "форма", "материал", и структура из трех полей - адрес доставки "улица", "дом", "квартира" и кучей методов и перегруженными операторами. Теперь мне нужно создать для него базовый абстрактный класс и построить иерархию классов для получения моего класса "Коробка" и его потомков, используя только простое наследование. Я немного запутался в этом задании. Подскажите как это можно сделать.
Вот класс "Коробка".
box.h
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
39
40
41
42
43
44
45
46
47
48
49
#ifndef _box_h_
#define _box_h_
 
#include <iostream>
#include <string>
 
class Box
{
public:
    struct adr // структура адрес доставки
    {
        std::string street;
        int house, flat;
    };
 
private:
    std::string shape; // форма коробки
    adr address;  // переменная типа adr
    static std::string defaultName, defaultMaterial, defaultShape, defaultStreet;
    static int defaultHouse, defaultFlat, counter; // параметры по умолчанию
 
protected:
    std::string material; // материал
 
public:
    std::string name;  // имя
 
    Box();
    Box(std::string, std::string, std::string);
    Box(const Box&);
    void ShowBox(); // показать поля объекта
    void CinBox();  // ввести поля объекта с клавиатуры
    adr SetAddress(); // возвращает адрес доставки в виде структуры
    void SetAddress(std::string);
    void SetAddress(std::string, int); // меняет адрес доставки
    void SetAddress(std::string, int, int);
    static void SetDefaultParameters (std::string, std::string, std::string, std::string, int, int); // меняет параметры по умолчанию
    static int GetCount(); // счетчик созданных объектов
 
    bool operator < (Box&);
    bool operator > (Box&);
    bool operator == (Box&);
    bool operator != (Box&);
    friend std::ostream& operator << (std::ostream&, Box&);
    friend std::istream& operator >> (std::istream&, Box&);
 
    ~Box();
};
#endif
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2013, 14:56
Ответы с готовыми решениями:

Определение чисто виртуальных функций в потомках
Можно ли вместо определения чисто виртуальной функции в классе-потомке написать...

Назначение виртуальных методов класса
Что-то никак не могу разобраться с виртуальными методами классов. В учебниках...

Чисто виртуальные классы. Модификатор const
Приветствую всех! Известно, что чисто виртуальный (абстрактный) класс можно...

Реализация чистых виртуальных методов в производных классах
Здравствуйте! Интересует такой вопрос: Допустим, имеется у нас базовый...

Абстрактные классы
Помогите пожалуйста, сообразить не могу. Есть абстрактный класс. У него есть...

10
MrGluck
Модератор
Эксперт CЭксперт С++
8098 / 4950 / 1434
Регистрация: 29.11.2010
Сообщений: 13,429
03.11.2013, 14:58 2
Цитата Сообщение от gorus95 Посмотреть сообщение
Нигде не нашел на что влияет этот const.
Он влияет на this. Этот квалификатор после имени функции указывает на то, что внутри функции не меняется состояние объекта, т.е.
1) она не может менять свойства класса
2) она не может вызывать неконстантные функции
Разумеется, все это сделано для защиты и наглядности.
1
Croessmah
++Ͻ
14739 / 8422 / 1596
Регистрация: 27.09.2012
Сообщений: 20,713
Записей в блоге: 2
Завершенные тесты: 1
03.11.2013, 15:00 3
Цитата Сообщение от gorus95 Посмотреть сообщение
Нигде не нашел на что влияет этот const.
Что означает идендификатор const в обьявлении функции?
1
MrGluck
Модератор
Эксперт CЭксперт С++
8098 / 4950 / 1434
Регистрация: 29.11.2010
Сообщений: 13,429
03.11.2013, 15:03 4
Цитата Сообщение от gorus95 Посмотреть сообщение
Подскажите как это можно сделать.
Объявить класс Box с чисто виртуальной функцией delivery() и DeliveryBox, где определить эту функцию.
0
ct0r
Игогошка!
1789 / 690 / 44
Регистрация: 19.08.2012
Сообщений: 1,342
Завершенные тесты: 1
03.11.2013, 15:12 5
Цитата Сообщение от gorus95 Посмотреть сообщение
Видел несколько примеров, вопрос - чем отличаются вот таких два описания чисто виртуальной функции. Нигде не нашел на что влияет этот const.
В многопоточной среде в С++11 это значит, что несколько потоков могут обращаться к const-функции без какой-либо внешней синхронизации.
0
gorus95
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 169
Завершенные тесты: 1
03.11.2013, 15:15  [ТС] 6
MrGluck, то есть создать новый класс который будет абстрактным, например Box1
C++
1
2
3
4
5
class Box1
{
public:
   virtual void delivery() const = 0;
}
А потом сделать Box1 предком для класса Box и в нем определить delivery()?
C++
1
2
3
4
5
6
7
#include "box1.h"
class Box: public Box1
{
/* тут все что было ранее*/
public:
   void delivery() {/*реализация*/};
}
Я правильно понял?
0
MrGluck
Модератор
Эксперт CЭксперт С++
8098 / 4950 / 1434
Регистрация: 29.11.2010
Сообщений: 13,429
03.11.2013, 15:17 7
Я бы Box1 назвал Box, а просто Box DeliveryBox, иначе непонятно кто кому является предком и почему.

Добавлено через 1 минуту
И, кстати, указывая функцию без квалификатора const на конце, вы её не переопределяете, а перегружаете. И класс по прежнему останется абстрактным.
1
gorus95
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 169
Завершенные тесты: 1
03.11.2013, 15:22  [ТС] 8
MrGluck, спасибо, понял
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
03.11.2013, 15:54 9
Цитата Сообщение от ct0r Посмотреть сообщение
В многопоточной среде в С++11 это значит, что несколько потоков могут обращаться к const-функции без какой-либо внешней синхронизации.
А вот некий господин mutable с этим не согласен.
0
ct0r
Игогошка!
1789 / 690 / 44
Регистрация: 19.08.2012
Сообщений: 1,342
Завершенные тесты: 1
03.11.2013, 15:59 10
Цитата Сообщение от Nick Alte Посмотреть сообщение
А вот некий господин mutable с этим не согласен.
Это уже детали не интерфейса, а реализации. mutable при этом защищают либо мьютексом, либо делают атомарным - по ситуации.
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
03.11.2013, 16:13 11
Цитата Сообщение от ct0r Посмотреть сообщение
Это уже детали не интерфейса, а реализации. mutable при этом защищают либо мьютексом, либо делают атомарным - по ситуации.
Это вопрос того, какого стиля и каких правил придерживался разработчик класса. Одно только слово const в спецификации функции само по себе не даёт гарантий её потокобезопасности.
Точно так же, как нет гарантий, что деструктор класса, в котором есть виртуальные функции, сам является виртуальной функцией. Да, крайне желательно, чтобы он был виртуальным, да, нет причин не делать его таковым, и мы можем более-менее уверенно предполагать, что разработчик класса придерживался этого правила. Но твёрдых нерушимых гарантий нет.
0
03.11.2013, 16:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2013, 16:13

Абстрактные классы
В общем есть у нас 2 абстрактных класса CA и CB и 2 дочерних от них класса CC и...

Абстрактные классы
Народ, вопрос есть такой. Есть абстрактный класс class A { protected:...

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


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

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

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