C++ recap: Inheritance
Example #1:
#include <iostream> class Base { public: int value; Base(int v = 0) : value(v) {} }; class Derived: public Base { public: double dValue; Derived(int v, double d = 2.22) : Base(v), dValue(d) {} /* We need to call the Base constructor to initialize Base member values; why? To make sure that subsequent constructors of derived classes do not override a base class const variable. Const values and references are always initialized in the initialization list of the constructor */ }; int main() { using namespace std; Derived d(2,3); cout << d.value << endl; cout << d.dValue << endl; return 0; }
Example #2:
#include <iostream> using namespace std; /* Member variables can be accessed according to the access specifiers: - private: by member functions only - protected: by member functions and derived classes - public: by anybody A derived class accesses inherited members based on the access specifiers of its immediate parent */ class Base { private: int priv; protected: int prot; public: int publ; Base(int a = 0, int b = 0, int c = 0) : priv(a), prot(b), publ(c) {} }; /* Public inheritance: all members keep their original access specifications. */ class publicDerived : public Base { public: publicDerived() { // priv = 9; // no prot = 9; publ = 9; } }; /* Private inheritance: everything bumps up to private */ class privateDerived : private Base { public: privateDerived() { // priv = 9; // no prot = 9; publ = 9; } }; /* Protected inheritance: everything bumps up to protected */ class protectedDerived : protected Base { public: protectedDerived() { // priv = 9; // no prot = 9; publ = 9; } }; int main() { publicDerived d1; // cout << d1.priv; // no // cout << d1.prot; // no cout << d1.publ; privateDerived d2; // cout << d2.priv; // no // cout << d2.prot; // no // cout << d2.publ; // no protectedDerived d3; // cout << d3.priv; // no // cout << d3.prot; // no // cout << d3.publ; // no return 0; }
Common patterns:
1) I don’t want anyone to be able to create a Base class object directly, but only Derived1 and Derived2 objects.
=> make the Base constructor