IntroductionThis article describes basic concepts of C++ Inheritance mechanism.
- Inheritance is a mechanism of reusing and extending existing classes without modifying them, thus producing hierarchical relationships between them.
- Inheritance is implemented in C++ through the mechanism of derivation. Derivation allows you to derive a class, called a derived class, from another class, called a base classes
- The class whose members you want to include in your new class is called a base class. Your new class is derived from the base class.
- You can also add new data members and member functions to the derived class.
- When you derive a class, the derived class inherits class members of the base class. You can refer to inherited members (base class members) as if they were members of the derived classes
- You can modify the implementation of existing member functions or data by overriding base class member functions or data in the newly derived class. If a member of a derived class has the same name as a base class, the base class name is hidden in the derived class.
- You may derive classes from other derived classes, thereby creating another level of inheritance. The number of levels of inheritance is only limited by resources.
- The new class contains a subobject of the type of the base classes
- Multiple inheritance allows you to create a derived class that inherits properties from more than one base classes
- Because a derived class inherits members from all its base classes, ambiguities can result
- In case of ambigious data members a solution would be to override the base class members
- we can still access the override members of the base class using scope resolution operator
- A direct base class cannot appear in the base list of a derived class more than once:
- A derived class can inherit an indirect base class more than once.However this may result in ambiguities since it can be considered that 2 subobjects of Parent class exist which are both accessible throught the derived class.
Virtual Base Class
- A derived can have virtual and non virtual base classes
- If a derived classes ,inherits from same base class via multiple inheritance,it will have 2 subobjects of the base class leading to ambiguity,hence the virtual base class keyword can be used to specify that derived object contain only one copy of the inherited base class.
- In an inheritance containing virtual base classes,
a name of class member that can be reached through more than one path
of inheritance is accessed through the path that gives the most access.
Ambiguous base classes
- The order of derivation is relevant only to determine the order of default initialization by
constructors and cleanup by destructors.
Using Keyword Declaration
- A member function in the derived class will hide all other members with same name in the base class regardless of type of arguments or return type
- A using declaration in a definition of a class A allows you to introduce a name of a data member or member function from a base class of A into the scope of A
- If the function with same names as that of base class declared with using keyword is present in the derived class the function in base class will be hidden and no conflict arises.
- Using Declaration cannot resolve ambiguities due to same inherited members
- The declaration of a member with an ambiguous name in a derived class is not an error. The ambiguity is only flagged as an error if you use the ambiguous member name.
Pointer Derived Class and Base Class
- Pointer to a Derived class can be converted to pointer of the base class
- A pointer to base class cannot be derived to case class.
- Members and friends of a class can implicitly convert a pointer to an object of that class to a pointer to either protected or public direct or indirect base class and direct private base class.
- A direct base class is a base class that appears directly as a base specifier in the declaration of its derived class. An indirect base class is a base class that does not appear directly in the declaration of the derived class but is available to the derived class through one of its base classes For a given class, all base classes that are not direct base classes are indirect base classes. The following example demonstrates direct and indirect base classes
- Classes that are declared but not defined are not allowed in base lists.
Inherited member access
- while inheriting the members from base class,we can hide some information of the base class.This can be done by specifying the access specifier.
- An access specifier can be public, private, or protected.
- In a public base class access the public and protected members of the base class remain public and protected members of the derived class respectively.
- In a protected base class access the public and protected members of the base class are protected members of the derived class.
- In a private base class access the public and protected members of the base class become the private members of the derived class.
- The private members of the base class remain private members of derived classes
- Private members of the base class cannot be used by the derived class unless friend declarations within the base class explicitly grant access to them.
- The default access specifier is private
- Suppose class B is a direct base class of class A. To restrict access of class B to the members of class A, derive B from A using either the access specifiers protected or private.
- To increase the access of a member x of class A inherited from class B, use a using declaration.You cannot restrict the access to x with a using declarations
- Access can be increase to member inherited as private or declared/inherited as protected
- Access to members declared as private in the base class cannot be increased
- Access to a member cannot be reduced with a using declaration