Colen
Colen

Reputation: 13918

Can I make a public member variable private in a derived class?

I want to do make a public member in a base class private in a derived class, like this:

class A {
public:
    int   x;
    int   y;
};

class B : public A {
    // x is still public
private:
    // y is now private
    using y;
};

But apparently "using" can't be used that way. Is there any way to do this in C++?

(I can't use private inheritance because there are other members and functions of A that must still be public.)

Upvotes: 8

Views: 3442

Answers (2)

Chubsdad
Chubsdad

Reputation: 25557

Yes, using declaration technically allows you to do so.

You have to use using A::y instead of using y

However please seriously evaluate if doing this makes a design sense.

Few observations:

  1. Your class should not have public data. That should be avoided as far as possible. If you stick to this design principle, you may not have a need to make it private in derived class.

  2. Stick to LSP. If a base class has public method, and unless you are doing private inheritance, clients will be confused if the derived class makes the base class method private with such using declarations.

Upvotes: 6

munificent
munificent

Reputation: 12374

Short answer: no. Liskov substitution and the nature of public inheritance demands that everything that you can do with an A (i.e. its public members) can also be done by B. That means you can't hide a public method.

If you're trying to hide public fields, there isn't much you can do. To "hide" public methods, you could do something like:

class B {
    // x is still public
    int x() { return a.x(); }
private:
    A a;
    // y is now private since you didn't add a forwarding method for it
};

Upvotes: 3

Related Questions