Although this is a bare homework-ish question, I'm going to answer it because it is a terrible question. I would almost consider it a trick question, and it doesn't really make for a good test of knowledge.
The answer is 2. GraduateStudent does not have access to private objects of Student., except that this has nothing at all to do with private inheritance. Point 2 would be true whether or not the public
keyword were present, since derived classes never have access to the private members of their base classes, no matter how they inherit.
Private inheritance means essentially two things (as opposed to public inheritance):
All public methods of Student
become private methods in GraduateStudent
. That means that if, for example, Student
has a public method foo()
, then GraduateStudent
has a private method foo()
.
The base class is "inaccessible", which means that polymorphism does not work. In layman's terms, this means that if GraduateStudent
inherits privately from Student
, then you cannot treat a GraduateStudent*
as if it were a Student*
(or a GraduateStudent&
as if it were a Student&
).
It's possible that the author of the question also meant for point 1 to be a correct answer, but it is ambiguously worded. What does it mean that "GraduateStudent
objects may not use methods of Student
"? It's possible that the intent is for this to mean that you cannot call methods inherited from Student
on objects of type GraduateStudent
, like I wrote in the first point above, but the GraduateStudent
object itself, within its methods, can use methods of Student
.
For example:
class Student {
public:
void foo() {};
};
class GraduateStudent : Student {
public:
void bar()
{
foo(); // Legal
}
};
int main() {
GraduateStudent g;
g.bar(); // Legal
g.foo(); // Illegal
return 0;
};