На самом деле есть два способа сделать это. Даг Т. дал очень хороший обзор первого - с использованием частного / защищенного наследования и композиции - поэтому я не буду вдаваться в подробности.
Проблема с использованием частного / защищенного наследования заключается в том, что оно маскирует все . Затем вы должны выборочно выставлять участников, которые вы все еще хотите быть публичными. Если вы хотите, чтобы все оставалось публичным, и пытаетесь скрыть только одну вещь, то это может стать большой головной болью. Это порождает потребность в втором способе сделать это - с ключевым словом using
.
Например, в вашем случае вы можете просто объявить свой класс следующим образом:
class Child : public Parent
{
//...
private:
using Parent::SetText; // overrides the access!
};
Этот только маскирует метод SetText!
Только запомните, что указатель на Child
всегда можно привести к указателю на Parent
, и доступ к этому методу снова становится возможным - но это тоже проблема с наследованием:
class Parent
{
public:
void SomeMethod() { }
void AnotherMethod() { }
};
class ChildUsing : public Parent
{
private:
using Parent::SomeMethod;
};
class ChildPrivateInheritance : private Parent
{
};
void main()
{
Parent *p = new Parent();
ChildUsing *a = new ChildUsing();
ChildPrivateInheritance *b = new ChildPrivateInheritance();
p->SomeMethod(); // Works just fine
a->SomeMethod(); // !! Won't compile !!
a->AnotherMethod(); // Works just fine
((Parent*)a)->SomeMethod(); // Compiles without a problem
b->SomeMethod(); // !! Won't compile !!
b->AnotherMethod(); // !! Won't compile !!
((Parent*)b)->SomeMethod(); // Again, compiles fine
delete p; delete a; delete b;
}
Попытка доступа к SomeMethod
в экземпляре ChildUsing
приводит к (в VS2005):
error C2248: 'ChildUsing::SomeMethod' : cannot access private member declared in class 'ChildUsing'
Однако попытка получить доступ к SomeMethod
или AnotherMethod
в экземпляре ChildPrivateInheritance
приводит к:
error C2247: 'Parent::SomeMethod' not accessible because 'ChildPrivateInheritance' uses 'private' to inherit from 'Parent'