$ cat inheritance.cpp #include <iostream> using namespace std; class A { }; class B : private A { }; int main() { A* ab = new B; } $ $ g++ inheritance.cpp inheritance.cpp: In function 'int main()': inheritance.cpp:9: error: 'A' is an inaccessible base of 'B' $
I just do not understand this error.
As I understand, and as this tutorial confirms, private
inheritance should only change how the members of class B
are visible to the outside world.
I think the private specifier is doing more than just change visibility of class B
members here.
Inheritance enables you to create new classes that reuse, extend, and modify the behavior defined in other classes. The class whose members are inherited is called the base class, and the class that inherits those members is called the derived class. A derived class can have only one direct base class.
Inheritance allows us to define a class in terms of another class, which makes it easier to create and maintain an application. This also provides an opportunity to reuse the code functionality and fast implementation time.
Constructor cannot be inherited but a derived class can call the constructor of the base class.
Explanation: When the inheritance is private, the private methods in base class are inaccessible in the derived class (in C++). 2.
By making the inheritance private, you're basically saying that even the fact that B inherits from A (at all) is private -- not accessible/visible to the outside world.
Without getting into a long-winded discussion of what would happen if it was allowed, the simple fact is that it's not allowed. If you want to use a pointer to base to refer to an object of derived type, then you're pretty much stuck with using public inheritance.
Private inheritance is not necessarily (or even normally) intended to follow the Liskov substitution principle. Public inheritance asserts that a derived object can be substituted for an object of the base class, and proper semantics will still result. Private inheritance does not assert that though. The usual description of the relationship implied by private inheritance is "is implemented in terms of".
Public inheritance means a derived class maintains all the capabilities of the base class and potentially adds more besides. Private inheritance often means more or less the opposite: that the derived class uses a general base class to implement something with a more restricted interface.
Just for example, let's assume for the moment that the containers in the C++ standard library were implemented using inheritance rather than templates. In the current system, std::deque
and std::vector
are containers, and std::stack
is a container adapter that provides a more restricted interface. Since it is based on templates, you can use std::stack
as an adapter for either std::deque
or std::vector
.
If we wanted to provide essentially the same with inheritance, we would probably use private inheritance, so std::stack
would be something like:
class stack : private vector { // ... };
In this case, we definitely do not want the user to be able to manipulate our stack
as if it were a vector
. Doing so could (and likely would) violate the expectations of a stack (e.g., the user could insert/remove items in the middle, rather than a purely stack-like fashion as intended). We're basically using vector
as a convenient way to implement our stack, but if (for example) we changed the implementation for stack
stand alone (with no dependence on a base class) or re-implement it in terms of std::deque
, we do not want that to affect any client code -- to the client code, this is supposed to be just a stack, not some specialized variety of vector (or deque).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With