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

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

Войти
Регистрация
Восстановить пароль
 
gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 151
Завершенные тесты: 1
#1

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

03.11.2013, 14:56. Просмотров 594. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Описание чисто виртуальных методов, Абстрактные классы (C++):

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

Назначение виртуальных методов класса - C++
Что-то никак не могу разобраться с виртуальными методами классов. В учебниках пишут, что они нужны при наследовании для определения одной и...

Чисто виртуальные классы. Модификатор const - C++
Приветствую всех! Известно, что чисто виртуальный (абстрактный) класс можно получить class A { public: virtual void test()=0; };...

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

Абстрактные классы - C++
Ребята! Помогите с таким делом. Мне дали задание создать абстрактный класс Автомобиль, классы наследники: гоночный автомобиль, асфальтный...

Абстрактные классы - C++
Объясните пожалуйста почему это не работает и как исправить? cannot declare variable 'b1' to be of abstract type 'classB' because the...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
03.11.2013, 14:58 #2
Цитата Сообщение от gorus95 Посмотреть сообщение
Нигде не нашел на что влияет этот const.
Он влияет на this. Этот квалификатор после имени функции указывает на то, что внутри функции не меняется состояние объекта, т.е.
1) она не может менять свойства класса
2) она не может вызывать неконстантные функции
Разумеется, все это сделано для защиты и наглядности.
1
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 843
Регистрация: 27.09.2012
Сообщений: 18,401
Записей в блоге: 3
Завершенные тесты: 1
03.11.2013, 15:00 #3
Цитата Сообщение от gorus95 Посмотреть сообщение
Нигде не нашел на что влияет этот const.
Что означает идендификатор const в обьявлении функции?
1
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
03.11.2013, 15:03 #4
Цитата Сообщение от gorus95 Посмотреть сообщение
Подскажите как это можно сделать.
Объявить класс Box с чисто виртуальной функцией delivery() и DeliveryBox, где определить эту функцию.
0
ct0r
Игогошка!
1773 / 675 / 42
Регистрация: 19.08.2012
Сообщений: 1,287
Завершенные тесты: 1
03.11.2013, 15:12 #5
Цитата Сообщение от gorus95 Посмотреть сообщение
Видел несколько примеров, вопрос - чем отличаются вот таких два описания чисто виртуальной функции. Нигде не нашел на что влияет этот const.
В многопоточной среде в С++11 это значит, что несколько потоков могут обращаться к const-функции без какой-либо внешней синхронизации.
0
gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 151
Завершенные тесты: 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Эксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
03.11.2013, 15:17 #7
Я бы Box1 назвал Box, а просто Box DeliveryBox, иначе непонятно кто кому является предком и почему.

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

абстрактные классы - C++
компилятор ругается когда я пытаюсь записать объект класса!!!! подскажите что я не правильно делаю!! #include &lt;cstdlib&gt; #include...

Абстрактные классы - C++
Никак не могу понять смысл абстрактных данных.Ведь мы можем использовать и обычный класс,только абстракция запрещает создавать объекты.

Абстрактные классы - C++
Народ, вопрос есть такой. Есть абстрактный класс class A { protected: int a; public: A(int b=0):a(b) {

Абстрактные классы - C++
Помогите пожалуйста, сообразить не могу. Есть абстрактный класс. У него есть метод, чтение из файла. Есть производный от него класс....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.11.2013, 16:13
Ответ Создать тему
Опции темы

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