вопрос по private наследованию
От: Аноним  
Дата: 24.02.13 12:33
Оценка:
кто-нить может чётко объяснить почему такой код не работает

class A
{
public:
    A() {}    

};

class B:  A
{
public:
    B() { }

};


void main()
{    
    A* b=new B();
}


Почему нельзя указателю на базовый класс присвоить указатель на объект производного. Понятно, что дело в private наследовании. Но кто может дать ссылочку, где можно об этом почитать.
Заранее спасибо
Re: вопрос по private наследованию
От: LaptevVV Россия  
Дата: 24.02.13 12:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>кто-нить может чётко объяснить почему такой код не работает


А>Почему нельзя указателю на базовый класс присвоить указатель на объект производного. Понятно, что дело в private наследовании. Но кто может дать ссылочку, где можно об этом почитать.

Принцип подстановки работает в С++ только для открытого наследования.
У Скотта Мейерса немного об этом написано в его советах по С++.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: вопрос по private наследованию
От: Vamp Россия  
Дата: 25.02.13 17:01
Оценка: -1
А>Понятно, что дело в private наследовании. Но кто может дать ссылочку, где можно об этом почитать.
Читай Liskov Substitution Principle. Private-наследование обеспечивает отношение HAS-A, а не IS-A.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: вопрос по private наследованию
От: Erop Россия  
Дата: 25.02.13 17:13
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Читай Liskov Substitution Principle. Private-наследование обеспечивает отношение HAS-A, а не IS-A.


Что, и даже в области виртуальных функций, например?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: вопрос по private наследованию
От: Vamp Россия  
Дата: 25.02.13 18:54
Оценка:
E>Что, и даже в области виртуальных функций, например?..
Не понимаю вопроса. Причем тут виртуальные функции? Точнее, как связаны теоретическое понятие принципа подстановки (характерного для объектного программирования вообще) и С++-специфичное понятие виртуальной функции?
Да здравствует мыло душистое и веревка пушистая.
Re[4]: вопрос по private наследованию
От: Erop Россия  
Дата: 25.02.13 19:28
Оценка: +1
Здравствуйте, Vamp, Вы писали:

V>Не понимаю вопроса. Причем тут виртуальные функции? Точнее, как связаны теоретическое понятие принципа подстановки (характерного для объектного программирования вообще) и С++-специфичное понятие виртуальной функции?


На мой взгляд приватное наследование в С++ нихрена ООПшного не выражает.
Ты же, как я тебя понял, защищаешь точку зрения что приваное наследование -- это агрегация базы наследником, так?
Если так, то поясни, как этот тезис уживается с тем, что наследование доступно при этом дружественному коду и как быть с особенностями поведения виртуальных функций.

Например, если у приватной базы есть виртуальный деструктор, то весь наиболее выведенный объект можно удалить по указателю на приватную базу, в то время, как для агрегации такое поведени енифига не характерно... Обычно агрегируемый объект никак ничего не знает об агрегирующем. В этом как бы суть отношени агрегации, не?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: вопрос по private наследованию
От: Vamp Россия  
Дата: 25.02.13 19:46
Оценка:
E>Ты же, как я тебя понял, защищаешь точку зрения что приваное наследование -- это агрегация базы наследником, так?
Нет. Приватное наследование — это реализация принципа HAS-A. То есть, объект обладает функциональностью класса-предка, но не является им.

E>Если так, то поясни, как этот тезис уживается с тем, что наследование доступно при этом дружественному коду и как быть с особенностями поведения виртуальных функций.

Дружественный код — это вообще отдельная песня.

E>Например, если у приватной базы есть виртуальный деструктор, то весь наиболее выведенный объект можно удалить по указателю на приватную базу, в то время, как для агрегации такое поведени енифига не характерно... Обычно агрегируемый объект никак ничего не знает об агрегирующем. В этом как бы суть отношени агрегации, не?..

Я не знаю, зачем ты говоришь про аггрегацию. Я про нее вообще ни слова не говорил.
Да здравствует мыло душистое и веревка пушистая.
Re[6]: вопрос по private наследованию
От: uzhas Ниоткуда  
Дата: 25.02.13 20:05
Оценка: 10 (1)
Здравствуйте, Vamp, Вы писали:

V>Приватное наследование — это реализация принципа HAS-A.


очень грубое аналогия с ООП принципами
написано об этом здесь: http://www.parashift.com/c++-faq/priv-inherit-like-compos.html
о том, как связана композиция и агрегация с отношением has a, можно почитать здесь: http://en.wikipedia.org/wiki/Has-a

по теме можно почитать здесь: http://stackoverflow.com/questions/1576978/private-inheritance
Re[6]: вопрос по private наследованию
От: Erop Россия  
Дата: 25.02.13 20:13
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Нет. Приватное наследование — это реализация принципа HAS-A. То есть, объект обладает функциональностью класса-предка, но не является им.


Двай на примере?..
Скажем есть у меня интерфейс к итератору бора, в котором лежит словарь. Бор берёт на вход кол-бэк, через который и возвращает найденные слова.
При этом в бору у меня есть методы, которые могут вернуть найденные слова просто массивом сразу.
Их можно реалзовать через такой же колбэк, но приватный. Иногда удобно что бы сам бор его и реализовывал.
По идее это всего лишь подробность реализации бора, никакой функциональностью колбэка он при этом не обладает, во всяком случае для внешних пользователей.

И при чём тут у нас получает HAS-A?..

V>Дружественный код — это вообще отдельная песня.

В смысле отдельная? Это же С++, а не смолтолк? Какая такая отдельная?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.