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

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

Восстановить пароль Регистрация
 
gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 145
03.11.2013, 14:56     Описание чисто виртуальных методов, Абстрактные классы #1
Здравствуйте.
Изучаю наследование, абстрактные классы. Возникло два вопроса:

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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2013, 14:56     Описание чисто виртуальных методов, Абстрактные классы
Посмотрите здесь:

C++ абстрактные классы
C++ Чисто виртуальные классы. Модификатор const
C++ Абстрактные классы
Абстрактные классы C++
Определение чисто виртуальных функций в потомках C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
03.11.2013, 14:58     Описание чисто виртуальных методов, Абстрактные классы #2
Цитата Сообщение от gorus95 Посмотреть сообщение
Нигде не нашел на что влияет этот const.
Он влияет на this. Этот квалификатор после имени функции указывает на то, что внутри функции не меняется состояние объекта, т.е.
1) она не может менять свойства класса
2) она не может вызывать неконстантные функции
Разумеется, все это сделано для защиты и наглядности.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
03.11.2013, 15:00     Описание чисто виртуальных методов, Абстрактные классы #3
Цитата Сообщение от gorus95 Посмотреть сообщение
Нигде не нашел на что влияет этот const.
Что означает идендификатор const в обьявлении функции?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
03.11.2013, 15:03     Описание чисто виртуальных методов, Абстрактные классы #4
Цитата Сообщение от gorus95 Посмотреть сообщение
Подскажите как это можно сделать.
Объявить класс Box с чисто виртуальной функцией delivery() и DeliveryBox, где определить эту функцию.
ct0r
C++/Haskell
 Аватар для ct0r
1550 / 569 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
03.11.2013, 15:12     Описание чисто виртуальных методов, Абстрактные классы #5
Цитата Сообщение от gorus95 Посмотреть сообщение
Видел несколько примеров, вопрос - чем отличаются вот таких два описания чисто виртуальной функции. Нигде не нашел на что влияет этот const.
В многопоточной среде в С++11 это значит, что несколько потоков могут обращаться к const-функции без какой-либо внешней синхронизации.
gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 145
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() {/*реализация*/};
}
Я правильно понял?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
03.11.2013, 15:17     Описание чисто виртуальных методов, Абстрактные классы #7
Я бы Box1 назвал Box, а просто Box DeliveryBox, иначе непонятно кто кому является предком и почему.

Добавлено через 1 минуту
И, кстати, указывая функцию без квалификатора const на конце, вы её не переопределяете, а перегружаете. И класс по прежнему останется абстрактным.
gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 145
03.11.2013, 15:22  [ТС]     Описание чисто виртуальных методов, Абстрактные классы #8
MrGluck, спасибо, понял
Nick Alte
Эксперт С++
1591 / 983 / 116
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
03.11.2013, 15:54     Описание чисто виртуальных методов, Абстрактные классы #9
Цитата Сообщение от ct0r Посмотреть сообщение
В многопоточной среде в С++11 это значит, что несколько потоков могут обращаться к const-функции без какой-либо внешней синхронизации.
А вот некий господин mutable с этим не согласен.
ct0r
C++/Haskell
 Аватар для ct0r
1550 / 569 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
03.11.2013, 15:59     Описание чисто виртуальных методов, Абстрактные классы #10
Цитата Сообщение от Nick Alte Посмотреть сообщение
А вот некий господин mutable с этим не согласен.
Это уже детали не интерфейса, а реализации. mutable при этом защищают либо мьютексом, либо делают атомарным - по ситуации.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2013, 16:13     Описание чисто виртуальных методов, Абстрактные классы
Еще ссылки по теме:

C++ Абстрактные классы
Назначение виртуальных методов класса C++
Абстрактные классы C++

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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1591 / 983 / 116
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
03.11.2013, 16:13     Описание чисто виртуальных методов, Абстрактные классы #11
Цитата Сообщение от ct0r Посмотреть сообщение
Это уже детали не интерфейса, а реализации. mutable при этом защищают либо мьютексом, либо делают атомарным - по ситуации.
Это вопрос того, какого стиля и каких правил придерживался разработчик класса. Одно только слово const в спецификации функции само по себе не даёт гарантий её потокобезопасности.
Точно так же, как нет гарантий, что деструктор класса, в котором есть виртуальные функции, сам является виртуальной функцией. Да, крайне желательно, чтобы он был виртуальным, да, нет причин не делать его таковым, и мы можем более-менее уверенно предполагать, что разработчик класса придерживался этого правила. Но твёрдых нерушимых гарантий нет.
Yandex
Объявления
03.11.2013, 16:13     Описание чисто виртуальных методов, Абстрактные классы
Ответ Создать тему
Опции темы

Текущее время: 11:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru