Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2010, 21:57   #11
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Возможно, разница в этом.
Все хорошо.
Все плохо.
Все не очень хорошо.
still_alive вне форума Ответить с цитированием
Старый 27.06.2011, 01:45   #12
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

все-таки апну эту тему, чтобы внести ясность в книге "дизайн и эволюция С++" как раз сказано, почему можно ослаблять замещения. раньше в с++ этого делать было нельзя, и приходилось писать так:

Код:
class Base {
public:
    Base* clone() const
    {
        return new Base(*this);
    }
};

class Derived : public Base {
public:
    Base * clone() const
    {
        return new Derived(*this);
    }
};

Base *b = new Derived;
Derived* d = new Derived;

Base *b2 = b->clone(); // все нормально
Derived* d2 = d->clone(); // не нормально, требуется кастование

Derived *d3 = b->clone(); // не нормально, требуется кастование
со временем в языке разрешили замешать возвращаемый параметр с Base * на Derived *, и Base & на Derived &. соответственно теперь можно написать так:
Код:
class Base {
public:
    Base* clone() const
    {
        return new Base(*this);
    }
};

class Derived : public Base {
public:
    Derived * clone() const
    {
        return new Derived(*this);
    }
};

Base *b = new Derived;
Derived* d = new Derived;

Base *b2 = b->clone(); // все нормально
Derived* d2 = d->clone(); // теперь все нормально

Derived *d3 = b->clone(); // не нормально, требуется кастование
в строке же
Код:
Derived *d3 = b->clone(); // не нормально, требуется кастование
все и так логично, ибо имеем указатель на Base, который может указывать на что угодно. как пишет сам страуструп, функция clone создает идентичный объект класса, которому принадлежит. для этого и нужна виртуальная функция. вся разница в том, что имея указатель на базовый класс (который указывает на derived), мы все равно создадим копию derived, но общаться бы будем с ней только через интерфейс базового класса.

я изначально ошибался, тип можно использовать полиморфно. просто смотрел на это не под тем углом.
в общем, всем советую прочитать дизайн и эволюция с++, куча тонкостей станет ясна (кстати, и в классическом страуструпе этот момент рассматривается, но с другого угла)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 27.06.2011 в 01:58.
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонятки с return CodeNOT Общие вопросы C/C++ 2 03.12.2010 23:56
Вопрос по return fs444 Общие вопросы C/C++ 9 20.03.2010 15:07
return и echo dedyshka PHP 5 31.01.2010 16:58
Method must have a return type????? Bobrik Помощь студентам 5 18.05.2009 18:09