кто-нить может чётко объяснить почему такой код не работает
class A
{
public:
A() {}
};
class B: A
{
public:
B() { }
};
void main()
{
A* b=new B();
}
Почему нельзя указателю на базовый класс присвоить указатель на объект производного. Понятно, что дело в private наследовании. Но кто может дать ссылочку, где можно об этом почитать.
Заранее спасибо
Здравствуйте, Аноним, Вы писали:
А>кто-нить может чётко объяснить почему такой код не работает
А>Почему нельзя указателю на базовый класс присвоить указатель на объект производного. Понятно, что дело в private наследовании. Но кто может дать ссылочку, где можно об этом почитать.
Принцип подстановки работает в С++ только для открытого наследования.
У Скотта Мейерса немного об этом написано в его советах по С++.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
А>Понятно, что дело в private наследовании. Но кто может дать ссылочку, где можно об этом почитать.
Читай Liskov Substitution Principle. Private-наследование обеспечивает отношение HAS-A, а не IS-A.
Здравствуйте, Vamp, Вы писали:
V>Читай Liskov Substitution Principle. Private-наследование обеспечивает отношение HAS-A, а не IS-A.
Что, и даже в области виртуальных функций, например?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
E>Что, и даже в области виртуальных функций, например?..
Не понимаю вопроса. Причем тут виртуальные функции? Точнее, как связаны теоретическое понятие принципа подстановки (характерного для объектного программирования вообще) и С++-специфичное понятие виртуальной функции?
Здравствуйте, Vamp, Вы писали:
V>Не понимаю вопроса. Причем тут виртуальные функции? Точнее, как связаны теоретическое понятие принципа подстановки (характерного для объектного программирования вообще) и С++-специфичное понятие виртуальной функции?
На мой взгляд приватное наследование в С++ нихрена ООПшного не выражает.
Ты же, как я тебя понял, защищаешь точку зрения что приваное наследование -- это агрегация базы наследником, так?
Если так, то поясни, как этот тезис уживается с тем, что наследование доступно при этом дружественному коду и как быть с особенностями поведения виртуальных функций.
Например, если у приватной базы есть виртуальный деструктор, то весь наиболее выведенный объект можно удалить по указателю на приватную базу, в то время, как для агрегации такое поведени енифига не характерно... Обычно агрегируемый объект никак ничего не знает об агрегирующем. В этом как бы суть отношени агрегации, не?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
E>Ты же, как я тебя понял, защищаешь точку зрения что приваное наследование -- это агрегация базы наследником, так?
Нет. Приватное наследование — это реализация принципа HAS-A. То есть, объект обладает функциональностью класса-предка, но не является им.
E>Если так, то поясни, как этот тезис уживается с тем, что наследование доступно при этом дружественному коду и как быть с особенностями поведения виртуальных функций.
Дружественный код — это вообще отдельная песня.
E>Например, если у приватной базы есть виртуальный деструктор, то весь наиболее выведенный объект можно удалить по указателю на приватную базу, в то время, как для агрегации такое поведени енифига не характерно... Обычно агрегируемый объект никак ничего не знает об агрегирующем. В этом как бы суть отношени агрегации, не?..
Я не знаю, зачем ты говоришь про аггрегацию. Я про нее вообще ни слова не говорил.
Здравствуйте, Vamp, Вы писали:
V>Нет. Приватное наследование — это реализация принципа HAS-A. То есть, объект обладает функциональностью класса-предка, но не является им.
Двай на примере?..
Скажем есть у меня интерфейс к итератору бора, в котором лежит словарь. Бор берёт на вход кол-бэк, через который и возвращает найденные слова.
При этом в бору у меня есть методы, которые могут вернуть найденные слова просто массивом сразу.
Их можно реалзовать через такой же колбэк, но приватный. Иногда удобно что бы сам бор его и реализовывал.
По идее это всего лишь подробность реализации бора, никакой функциональностью колбэка он при этом не обладает, во всяком случае для внешних пользователей.
И при чём тут у нас получает HAS-A?..
V>Дружественный код — это вообще отдельная песня.
В смысле отдельная? Это же С++, а не смолтолк? Какая такая отдельная?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском