#include <iostream>
using namespace std;
class FriendClass;
class Base {
private:
int privateVar;
protected:
int protectedVar;
public:
int publicVar;
Base() : privateVar(1), protectedVar(2), publicVar(3) {
cout << "Base construction completed" << endl;
}
void showInside() {
cout << "Base::showInside() -> "
<< "privateVar=" << privateVar
<< ", protectedVar=" << protectedVar
<< ", publicVar=" << publicVar << endl;
}
private:
void privateFunc() {
cout << "Base::privateFunc() called" << endl;
}
protected:
void protectedFunc() {
cout << "Base::protectedFunc() called" << endl;
}
public:
void publicFunc() {
cout << "Base::publicFunc() called" << endl;
}
friend void globalFriendFunc(Base& b);
friend class FriendClass;
};
void globalFriendFunc(Base& b) {
cout << "globalFriendFunc() accessing private member: " << b.privateVar << endl;
cout << "globalFriendFunc() accessing protected member: " << b.protectedVar << endl;
cout << "globalFriendFunc() accessing public member: " << b.publicVar << endl;
b.privateFunc();
b.protectedFunc();
b.publicFunc();
}
class FriendClass {
public:
void accessBase(Base& b) {
cout << "FriendClass::accessBase() accessing private member: " << b.privateVar << endl;
cout << "FriendClass::accessBase() accessing protected member: " << b.protectedVar << endl;
cout << "FriendClass::accessBase() accessing public member: " << b.publicVar << endl;
b.privateFunc();
b.protectedFunc();
b.publicFunc();
}
};
class DerivedPublic : public Base {
private:
int derivedPrivate;
protected:
int derivedProtected;
public:
int derivedPublic;
DerivedPublic() : derivedPrivate(10), derivedProtected(20), derivedPublic(30) {}
void accessBaseMembers() {
cout << "Derived class accessing base class protected member: " << protectedVar << endl;
cout << "Derived class accessing base class public member: " << publicVar << endl;
}
void showDerived() {
cout << "DerivedPublic members: derivedPrivate(not accessible externally)=" << derivedPrivate
<< ", derivedProtected=" << derivedProtected
<< ", derivedPublic=" << derivedPublic << endl;
}
};
class DerivedPrivate : private Base {
public:
void accessBaseMembers() {
cout << "DerivedPrivate::accessBaseMembers() -> base class protected member: " << protectedVar << endl;
cout << "DerivedPrivate::accessBaseMembers() -> base class public member: " << publicVar << endl;
}
};
void externalFunc(Base& b) {
cout << "externalFunc() accessing public member: " << b.publicVar << endl;
b.publicFunc();
}
int main() {
cout << "========== 1. Base Class Object Direct Access ==========" << endl;
Base b;
b.publicVar = 100;
b.publicFunc();
cout << "\n========== 2. Base Class Internal Access ==========" << endl;
b.showInside();
cout << "\n========== 3. Derived Class Object (Public Inheritance) Access ==========" << endl;
DerivedPublic d;
d.publicVar = 101;
d.publicFunc();
d.derivedPublic = 31;
cout << "Derived class object accessing its own public member: " << d.derivedPublic << endl;
d.showDerived();
d.accessBaseMembers();
cout << "\n========== 4. Derived Class Member Function Internal Access ==========" << endl;
cout << "\n========== 5. External Regular Function Access ==========" << endl;
externalFunc(b);
cout << "\n========== 6. Friend Function Access ==========" << endl;
globalFriendFunc(b);
cout << "\n========== 7. Friend Class Access ==========" << endl;
FriendClass fc;
fc.accessBase(b);
cout << "\n========== 8. Effect of Private Inheritance ==========" << endl;
DerivedPrivate dp;
dp.accessBaseMembers();
cout << "Private inheritance makes all base class members invisible externally (except through public interface provided by derived class)" << endl;
cout << "\n========== Summary ==========" << endl;
cout << "- public: Accessible inside and outside class, inside and outside derived class (direct object access)." << endl;
cout << "- protected: Accessible inside class and derived class, not accessible outside class (except friends)." << endl;
cout << "- private: Only accessible inside class (and friends), not accessible in derived class." << endl;
cout << "- Friends break encapsulation and can access any member." << endl;
cout << "- Different inheritance types change access levels of base class members in derived class." << endl;
return 0;
}