Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запретить наследование 
:(
    Опции темы
Fedor
Дата 17.6.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



Не нашел такой темы...

как в с++ запретить наследование класса? 
в .net эта штука, насколько я понимаю называется sealed. А как здесь?

Это сообщение отредактировал(а) Fedor - 17.6.2007, 12:26


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Daevaorn
Дата 17.6.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Fedor @  17.6.2007,  13:25 Найти цитируемый пост)
А как здесь?

сделать конструкторы private. А для создания объекта написать "фабричный метод"
PM MAIL WWW   Вверх
Fedor
Дата 17.6.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



Цитата(Daevaorn @  17.6.2007,  12:31 Найти цитируемый пост)
 А для создания объекта написать "фабричный метод"

типа
Код

A* A::Create()
{}

??

Добавлено через 4 минуты и 3 секунды
Хотя так не пойдет... В общем, как это фабричный метод? )


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Xenon
Дата 17.6.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Я понимаю так.
Код

class Foo
{
private:
    int m_var;
    Foo(int var = 0):m_var(var){}
public:
    static Foo* create_Foo(int var = 0)
    {
        return new Foo(var);
    }
};
int main(int argc, char* argv[]) 
{
    Foo* obj = Foo::create_Foo(10);
    delete obj;
    std::cin.sync();
    std::cin.get();
    return 0;
}


Добавлено через 1 минуту и 53 секунды
Ну или так:
Код

class Foo
{
private:
    int m_var;
    Foo(int var = 0):m_var(var){}
public:
    friend Foo* create_Foo(int var);
};

Foo* create_Foo(int var = 0)
{
    return new Foo(var);
}

int main(int argc, char* argv[]) 
{
    Foo* obj = create_Foo(10);
    delete obj;
    std::cin.sync();
    std::cin.get();
    return 0;
}




--------------------
user posted image  
PM MAIL   Вверх
Feniksa
Дата 17.6.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.6.2007

Репутация: нет
Всего: нет



Fedor,  а какой компилятор используеш?  smile  В зависимости от компилятора, можно директивами заставить не наследовать класс... Всё зависит от компилятора (и его версии)  smile 
PM MAIL   Вверх
Damarus
Дата 17.6.2007, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(Feniksa @  17.6.2007,  13:45 Найти цитируемый пост)
В зависимости от компилятора, можно директивами заставить не наследовать класс...

 smile  smile 
PM MAIL ICQ Jabber   Вверх
Xenon
Дата 17.6.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Если комилятор для C#, то можно приписать sealed?  smile 


--------------------
user posted image  
PM MAIL   Вверх
Damarus
Дата 17.6.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(Xenon @  17.6.2007,  14:18 Найти цитируемый пост)
Если комилятор для C#, то можно приписать sealed?

Ну, так не интересно. Если тема в разделе C++, то и компиляторы должны быть для С++. 
PM MAIL ICQ Jabber   Вверх
Xenon
Дата 17.6.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Damarus, ну это был риторический вопрос автору идеи smile


--------------------
user posted image  
PM MAIL   Вверх
Fin
Дата 17.6.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



Вопрос на засыпку: Назовите внятную и вескую причину, Зачем нужно запрешать наследование? Тем самым нарушая основной принцип ООП.


--------------------
Пролетал мимо.
PM MAIL   Вверх
Xenon
Дата 17.6.2007, 16:14 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Fin, какой принцип? Где написано, что все классы должны иметь способность к классическому наследованию?

Это сообщение отредактировал(а) Xenon - 17.6.2007, 16:15


--------------------
user posted image  
PM MAIL   Вверх
Fin
Дата 17.6.2007, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



Xenon, Открой любой учебник, где хотя бы краем упоминается Объектно Оринтированное Программирование. Там обязательно будут упоменены три кита ООП: инкапсуляция, наследование и полиморфизм.


--------------------
Пролетал мимо.
PM MAIL   Вверх
skyboy
Дата 17.6.2007, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Fin, давай без фанатизма, а? то, что аксиоматическим началом эвклидовой геометрии является непересекаемость параллельных прямых вовсе не означает, что все прямые должны быть параллельны  smile 
PM MAIL   Вверх
Fin
Дата 17.6.2007, 17:58 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



Ну я так и не услышал причину? Или запретить ради запрешения smile В принципе на С++ я знаю как обойти данное закрытие наследования. Нужен только большой бубен и полчаса работы.


--------------------
Пролетал мимо.
PM MAIL   Вверх
Xenon
Дата 17.6.2007, 18:04 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Fin, открыл, ну и? Да, согласен, в ООП есть и инкапсуляция и полиморфизм и наследование ... Что, я теперь в каждом классе должен все функции помечать как virtual, приватные члены делать защищенными? А, ну тогда еще нельзя использовать friend, так как друзья - палки в колеса настоящему ООП.
Свою очередь могу посоветовать открыть Страуструпа на 23 главе "Разработка и проектирование"


--------------------
user posted image  
PM MAIL   Вверх
archimed7592
Дата 17.6.2007, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Fedor, лучше запретить деструктор - тогда будет класс как класс, но без возможности наследования.


Fin, поверь, причины бывают... как правило архитектурные.

Добавлено через 1 минуту и 6 секунд
Цитата(archimed7592 @  17.6.2007,  18:31 Найти цитируемый пост)
лучше запретить деструктор
эээ... хотя, туплю... класс как класс не буит... smile  сорри за запутывание...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
skyboy
Дата 17.6.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Fin, не знаю, быть может, мой пример - ошибка проектирования...Кроме того, не знаю, возможен ли такой поворот событий в С++(пример пришел из опыта программирования на Delphi)
были у меня объекты. реально конструируемые. а потом возникла потребность скрыть конструктор и сделать фабричный метод, чтоб предотвратить создание логически одинаковых объектов. И вот занаследует человек мой класс(ещё вопрос - зачем) и в своем конструкторе сделает вызов... моего фабричного метода. И фабричный метод найдет подходящий объект и увеличит его счетчик ссылок, или не найдет и создаст новый объект, который канет в бездну... В любом случае, человек со своим наследником моего класса не получит то, чего ожидал - вызов конструктора предка для дополнительной инициализации. Можно, конечно, раскомментировать случаи использования как только можно. Но безопасней было бы запретить наследование. И, если ему(клиенту) надо будет - пусть делает композицию с моим объектом. 
В общем, как на меня, запрет наследования был бы "в кассу" если необходимо предотвратить работу с фабричными методами вместо обычных конструкторов smile
P.S. Кидайте помидоры, мне даже интересно, где ошибся при проектировании smile
PM MAIL   Вверх
MAKCim
Дата 17.6.2007, 18:34 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Код

class A;

class B
{
private:
    B() {}
    friend class A;
};

// от A нельзя породить дочерний класс, т. к он должен 
// явно вызвать конструктор виртуального базового
// класса, но он - private, а friend-овость не наследуется
class A: virtual private B
{
};



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Vyacheslav
Дата 19.6.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(Fin @  17.6.2007,  17:58 Найти цитируемый пост)
Ну я так и не услышал причину? Или запретить ради запрешения  В принципе на С++ я знаю как обойти данное закрытие наследования. Нужен только большой бубен и полчаса работы. 

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



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 19.6.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Товарищи, чем вас не устраивает мой вариант?  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Xenon
Дата 19.6.2007, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



MAKCim, в принципе неплохо, но по-моему не очень очевидная реализация smile


--------------------
user posted image  
PM MAIL   Вверх
Vyacheslav
Дата 19.6.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(MAKCim @  19.6.2007,  12:34 Найти цитируемый пост)
Товарищи, чем вас не устраивает мой вариант?    

А виртуальное наследование то зачем, если предполагается, что от класса A унаследовать больше нельзя?



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 19.6.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Vyacheslav, 
а если комментарии прочитать  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Xenon
Дата 19.6.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Vyacheslav, без виртуального наследования производные классы от A можно будет строить


--------------------
user posted image  
PM MAIL   Вверх
Vyacheslav
Дата 19.6.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Вопрос снят smile


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 19.6.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Xenon @  19.6.2007,  12:43 Найти цитируемый пост)
в принципе неплохо, но по-моему не очень очевидная реализация

зато действенная
и объекты класса A можно без напряга создавать


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 19.6.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



MAKCim, минус твоей реализации: оверхэд из-за виртуального наследования. Ну это так - для общей картины smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
math64
Дата 19.6.2007, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Код

class A;    
class B    
{    
private:    
    B() {}    
    friend class A;    
};    
// от A нельзя породить дочерний класс, т. к он должен    
// явно вызвать конструктор виртуального базового    
// класса, но он - private, а friend-овость не наследуется    
class A: virtual private B    
{    
};

class C : public A {
};


Компилирется gcc без ошибок
PM   Вверх
Daevaorn
Дата 19.6.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(math64 @  19.6.2007,  16:00 Найти цитируемый пост)
Компилирется gcc без ошибок 

Добавь конструкторы или явно инстанцируй C
PM MAIL WWW   Вверх
MAKCim
Дата 19.6.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(archimed7592 @  19.6.2007,  14:58 Найти цитируемый пост)
MAKCim, минус твоей реализации: оверхэд из-за виртуального наследования.

есть вариант лучше?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
  Дата 19.6.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(MAKCim @  19.6.2007,  17:04 Найти цитируемый пост)
есть вариант лучше?

MAKCim, я же специально сказал:
Цитата(archimed7592 @  19.6.2007,  14:58 Найти цитируемый пост)
Ну это так - для общей картины

Можно сделать как у тебя и поиметь удобство(+) и оверхэд(-). Можно сделать иначе и поиметь неудобство(-) и скорость(+). Смотря что критичней - зависит от ситуации. Лучших решений не бывает. Бывают рациональные.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 19.6.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(archimed7592 @  19.6.2007,  17:10 Найти цитируемый пост)
Можно сделать как у тебя и поиметь удобство(+) и оверхэд(-). Можно сделать иначе и поиметь неудобство(-) и скорость(+). Смотря что критичней - зависит от ситуации. Лучших решений не бывает. Бывают рациональные. 

надо бы проверить насколько мой вариант уступает в скорости (если вообще уступает)
если использовать static функцию + new
Код

...
static A *create() {
    return new A();
}
...

то однозначно мой вариант быстрее в случае статических объектов 
Код

A a;

и немного уступает в случае динамического создания 
Код

A *a = new A();

засчет дополнительного создания объекта класса B, но класс B - пустой и при достаточной оптимизации подобъект этого класса вообще можно не создавать


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0794 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.