views:

53

answers:

2

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.)

+2  A: 

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
};
munificent
+1  A: 

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.

Chubsdad