7 / 7 / 1
Регистрация: 22.12.2012
Сообщений: 173
1

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

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

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

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

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

Интерфейсы и абстрактные классы: обеспечить работу методов в конечном классе
Имеются два шаблонных интерфейса, в которых описан метод Print() От этих двух интерфейсов...

Зачем нужны абстрактные классы и абстрактные методы?
Приветствую всех. Нужна помощь. Узнал про существование абстрактных классов и методов. Вопрос:зачем...

Проблема в понимании ООП(абстрактные классы, классы интерфейсы)
Всем здравия. Читал в свое время разные книги(к примеру, Гради Буч по проектированию) вроде все...

10
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
03.11.2013, 14:58 2
Цитата Сообщение от gorus95 Посмотреть сообщение
Нигде не нашел на что влияет этот const.
Он влияет на this. Этот квалификатор после имени функции указывает на то, что внутри функции не меняется состояние объекта, т.е.
1) она не может менять свойства класса
2) она не может вызывать неконстантные функции
Разумеется, все это сделано для защиты и наглядности.
1
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
03.11.2013, 15:00 3
Цитата Сообщение от gorus95 Посмотреть сообщение
Нигде не нашел на что влияет этот const.
Что означает идендификатор const в обьявлении функции?
1
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
03.11.2013, 15:03 4
Цитата Сообщение от gorus95 Посмотреть сообщение
Подскажите как это можно сделать.
Объявить класс Box с чисто виртуальной функцией delivery() и DeliveryBox, где определить эту функцию.
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
03.11.2013, 15:12 5
Цитата Сообщение от gorus95 Посмотреть сообщение
Видел несколько примеров, вопрос - чем отличаются вот таких два описания чисто виртуальной функции. Нигде не нашел на что влияет этот const.
В многопоточной среде в С++11 это значит, что несколько потоков могут обращаться к const-функции без какой-либо внешней синхронизации.
0
7 / 7 / 1
Регистрация: 22.12.2012
Сообщений: 173
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
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
03.11.2013, 15:17 7
Я бы Box1 назвал Box, а просто Box DeliveryBox, иначе непонятно кто кому является предком и почему.

Добавлено через 1 минуту
И, кстати, указывая функцию без квалификатора const на конце, вы её не переопределяете, а перегружаете. И класс по прежнему останется абстрактным.
1
7 / 7 / 1
Регистрация: 22.12.2012
Сообщений: 173
03.11.2013, 15:22  [ТС] 8
MrGluck, спасибо, понял
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
03.11.2013, 15:54 9
Цитата Сообщение от ct0r Посмотреть сообщение
В многопоточной среде в С++11 это значит, что несколько потоков могут обращаться к const-функции без какой-либо внешней синхронизации.
А вот некий господин mutable с этим не согласен.
0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
03.11.2013, 15:59 10
Цитата Сообщение от Nick Alte Посмотреть сообщение
А вот некий господин mutable с этим не согласен.
Это уже детали не интерфейса, а реализации. mutable при этом защищают либо мьютексом, либо делают атомарным - по ситуации.
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
03.11.2013, 16:13 11
Цитата Сообщение от ct0r Посмотреть сообщение
Это уже детали не интерфейса, а реализации. mutable при этом защищают либо мьютексом, либо делают атомарным - по ситуации.
Это вопрос того, какого стиля и каких правил придерживался разработчик класса. Одно только слово const в спецификации функции само по себе не даёт гарантий её потокобезопасности.
Точно так же, как нет гарантий, что деструктор класса, в котором есть виртуальные функции, сам является виртуальной функцией. Да, крайне желательно, чтобы он был виртуальным, да, нет причин не делать его таковым, и мы можем более-менее уверенно предполагать, что разработчик класса придерживался этого правила. Но твёрдых нерушимых гарантий нет.
0
03.11.2013, 16:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.11.2013, 16:13
Помогаю со студенческими работами здесь

Вызов виртуальных методов
Добрый день! Не могу разобраться с примером из спецификации, объясните, пожалуйста, почему...

Использование виртуальных методов
На экзамене дали данную программу, но она не компилируется. Что предполагал автор всё же хотелось...

Наследование и переопределение виртуальных методов
Здравствуйте уважаемые программисты. Помогите разобраться с наследованием и переопределением...

Программирование динамических и виртуальных методов
Помогите, выдаёт ошибку! Ругается на функцию strcpy(), и на x4 = new MILKPRO(&quot;Мишка&quot;, 42, true); ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru