class Base {
public:
Base() : m_nDerivable(1) m_nSecret(0) {}
~Base() {}
int ReadBasePrivateData() { return m_nSecret; }
void ModifyBasePrivateData( int n ) { m_nSecret n; }
int foo() { return m_nSecret + m_nDerivable; }
protected:
int bar() { return m_nSecret + m_nDerivable; }
int m_nDerivable;
private:
int woozle() { return m_nSecret + m_nDerivable; } // can never be called even with access specifiers
int m_nSecret;
};
class PrivDeriv : private Base {
public:
PrivDeriv() {}
~PrivDeriv() {}
Base::ReadBasePrivateData; // access specifier we are allowed to read base's private things
Base::ModifyBasePrivateData; // access specifier we are allowed to write over base's private things
Base::foo; //public member allowed
//Base::bar; //protected member can be allowed but we selectively block it here
//Base::woozle; //private can not be allowed - compiler error
//int GetBasePrivateInt() { std::cout << "private derived get base private membern"; return Base::m_nSecret; } // compiler error
int GetBaseProtectedInt() { std::cout << "private derived get base protected membern"; return Base::m_nDerivable; }
private:
};
int main( int argc char** argv ) {
PrivDeriv a;
a.foo(); // allowed
//a.bar(); // compiler error
//a.woozle(); // compile error
int nPrivateInt a.ReadBasePrivateData();
std::cout << "private int is allowed through public read method: " << nPrivateInt << "n";
a.ModifyBasePrivateData( 10 ); // inaccessible compiler error
nPrivateInt a.ReadBasePrivateData();
std::cout << "private int has been changed through public write method: " << nPrivateInt << "n";
return 0;
}