"Leigh Johnston" <leigh@.co.uk> writes:
"carl" <carl@.com> wrote in message
news:4b803130$0$282$14726298@news.sunsite.dk...
Now I made another class that extends the above class. But when I
create the subclass I get some errors saying that the above fields
are private. I have tried to change the above visibility to
protected' and then it works. But since I would like to write my
subclass without making changes in the baseclass I would like to
know if its possible to change the visibility of the above fields in
my subclass. Any ideas?
You could use private inheritance and using declarations but it all
sounds a bit horrid. Member variables should typically be private so
you do not break invariants or protected if you know what you are
doing and the class is designed to be a base class.
Leigh, I'm not sure exactly how you're proposing this would work here.
Using declarations cannot make visible what is not already visible. And
what is it that you suppose that private inheritance adds? Are you
thinking that private inheritance somehow makes private members of the
base class available to the derived class? I'm not sure from your
wording, but then if not that then I don't see what it adds. Take this
example:
class A {
private:
int mA_private;
protected:
int mA_protected;
public:
int mA_public;
};
class B : private A {
public:
// using A::mA_private; // Not visible here ...
using A::mA_protected;
using A::mA_public;
};
int main()
{
B b;
// b.mA_private = 0;
b.mA_protected = 1;
b.mA_public = 2;
}
Here, B can *extend* the scope of the members of A that are visible to
it through using declarations, but it cannot make A's private members
visible, not even to itself.
Regards
Paul Bibbings
you can make a protected member in a base public in a derived. The other
example was private inheritance (see other reply). I am not advocating that
this is a good way forward as it breaks the idea of encapsulation.