Здравствуйте. Я бы хотел задать вопрос по закрытому наследованию в C++
Как известно если мы пишем
class A {
// ...
};
class B : private A {
// ...
};
То в В мы не сможем обращаться к членам А несмотря на то что А наследуется от В. Но в чем тогда смысл подобных действий если написав вот так:
class A {
// ...
};
class B {
public :
A a;
};
я смогу внутри В обращаться к членам А, а в первом случае не могу вообще ничего?
В втором случае у вас класс B наследуется от А и содержит поле типа А. То есть, получается, что по факту в B храниться две копии А. К одной доступ есть, к другой нет.
Есть несколько сценариев, когда стоит применять закрытое наследование вместо агрегации:
Если все это нужно, то закрытое наследование будет более предпочтительным агрегации.
Вот пример кода:
class A
{
public:
void PublicFoo() {}
virtual void VirtualPublicFoo() {}
protected:
void ProtectedFoo() {}
private:
void PrivateFoo() {}
};
class B : private A
{
friend void CrazyPolymorphicMethod(const A* a);
public:
// Поднимаем видимость одного из методов базового класса
using A::ProtectedFoo;
void Foo()
{
// Вызываем закрытый метод!
ProtectedFoo();
// Пример ограниченного полиморфизма
CrazyPolymorphicMethod(this);
}
private:
virtual void VirtualPublicFoo() override
{
// Переопределяем виртуальный метод!
}
};
void CrazyPolymorphicMethod(const A* a)
{
//
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как можно подключить файлы из одного проекта в другой в vs 2010?