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

Полиморфизм - C++

Восстановить пароль Регистрация
 
wowofbob
2 / 2 / 0
Регистрация: 19.01.2013
Сообщений: 32
30.07.2013, 16:58     Полиморфизм #1
Я хотел реализовать множество, используя
множественное наследование, но когда написал

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <class T>
class set {
protected:
    virtual bool is_empty() const = 0;
    virtual set<T> left() const = 0;
    virtual set<T> right() const = 0;
    virtual ~set() = 0;
};
 
template <class T>
class empty: protected set<T> {
public:
    bool is_empty() const {return true;}
    empty<T> left() const {return *this;}
    empty<T> right() const {return *this;}
    ~empty() { }
};
я столкнулся с проблемой:
в классе empty возникает ошибка - invalid covariant return type
в классе set возникает ошибка - overriding

Я гуглил и обнаружил, что в стандарте С++11 есть
ключевое слово override для таких случаев, но как
обходились до С++11? Как мне исправить код, чтобы
компилятор не выдавал ошибок?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2013, 16:58     Полиморфизм
Посмотрите здесь:

полиморфизм=( C++
C++ полиморфизм
C++ Полиморфизм
Полиморфизм. C++
Полиморфизм c++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
30.07.2013, 17:11     Полиморфизм #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
33
template <class T>
class set
{
protected:
    virtual bool is_empty() const = 0;
    virtual const set<T>& left() const = 0;
    virtual const set<T>& right() const = 0;
    virtual ~set() {};
};
 
template <class T>
class empty: protected set<T>
{
public:
    bool is_empty() const
    {
        return true;
    }
    
    const empty<T>& left() const
    {
        return *this;
    }
    
    const empty<T>& right() const
    {
        return *this;
    }
    
    ~empty()
    {
    }
};
override нужен для раннего отлова ошибок, т.е. с ним компиляться все равно не будет.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.07.2013, 17:11     Полиморфизм #3
Потому что надо обходиться указателями (или ссылками):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <class T>
class set {
protected:
    virtual bool is_empty() const = 0;
    virtual const set* left() const = 0;
    virtual const set* right() const = 0;
    virtual ~set() { };
};
 
template <class T>
class empty: public set<T> {
public:
    bool is_empty() const {return true;}
    const empty* left() const {return this;}
    const empty* right() const {return this;}
    ~empty() { }
};
wowofbob
2 / 2 / 0
Регистрация: 19.01.2013
Сообщений: 32
30.07.2013, 17:19  [ТС]     Полиморфизм #4
Спасибо!
Yandex
Объявления
30.07.2013, 17:19     Полиморфизм
Ответ Создать тему
Опции темы

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